内容来着《Offer来了》
Method提供了关于类或接口上某个方法及如何访问该方法的信息,那么在运行的代码中如何动态调用该方法呢?答案就通过调用Method的invoke方法。我们通过invoke方法可以实现动态调用,比如可以动态传入参数及将方法参数化。具体过程为:获取对象的Method,并调用Method的invoke方法,如下所述。
(1)获取Method对象:通过调用Class对象的getMethod(Stringname, Class<? >... parameterTypes)返回一个Method对象,它描述了此Class对象所表示的类或接口指定的公共成员方法。name参数是String类型,用于指定所需方法的名称。parameterTypes参数是按声明顺序标识该方法的形参类型的Class对象的一个数组,如果 parameterTypes为null,则按空数组处理。
(2)调用invoke方法:指通过调用Method对象的invoke方法来动态执行函数。invoke方法的具体使用代码如下:
//step 1:获取Persion类(hello.java.reflect.Persion)的Class对象
Class clz = Class.forName("hello.java.reflect.Persion");
//step 2:获取Class对象中的setName方法
Method method = clz.getMethod("setName", String.class);
//step 3:获取Constructor对象
Constructor constructor = clz.getConstructor();
//step 4:根据Constructor定义对象
Object object = constructor.newInstance(); //
//step 5:调用method的invoke方法,这里的method表示setName方法
//因此,相当于动态调用object对象的setName方法并传入alex参数
method.invoke(object, "alex");
以上代码首先通过Class.forName方法获取Persion类的Class对象;然后调用Persion类的Class对象的getMethod("setName",String.class)获取一个method对象;接着使用Class对象获取指定的Constructor对象并调用Constructor对象的newInstance方法创建Class对象对应类的实例;最后通过调用method.invoke方法实现动态调用,这样就通过反射动态生成类的对象并调用其方法。