首先invoke要学习invoke方法就首先要明白几个前提要素
-
随便建个对象
public class IWantSpeak { public IWantSpeak(){ System.out.println("无参构造"); } public IWantSpeak(String params){ System.out.println("有参构造:" + params); } public void iWantSayHello(){ System.out.println("奥利给兄弟们"); } public void iWantSayWhat(String word){ System.out.println("i say " + word); } }
-
Class对象的几种获取方式,反射
Class<IWantSpeak> iWantSpeakClass = IWantSpeak.class; //直接通过类名点出来,是最简单的方式,
IWantSpeak iWantSpeak = new IWantSpeak(); Class<? extends IWantSpeak> iWantSpeakClass = iWantSpeak.getClass(); //先实例化然后通过getClass方法获得,静态和动态代码块都会执行,构造方法
Class<?> iWantSpeakClass = Class.forName("com.sqlboy.study.tests.IWantSpeak"); //通过forName方法完整路径点出来,但是需要处理异常而且会执行静态代码块
-
获取反射对象所有方法的两种方式
Method[] declaredMethods = iWantSpeakClass.getDeclaredMethods(); //获取类自身声明的所有方法,不管是private修饰还是public修饰
Method[] methods = iWantSpeakClass.getMethods(); //获取类的所有public修饰的方法,包括从父类继承下来的,如toString啊这种
-
通过invoke方法运行对象方法
Method iWantSayHello = iWantSpeakClass.getDeclaredMethod("iWantSayHello"); //这个方法类似上面的getDeclaredMethods(),是指定某个方法名获得方法对象 IWantSpeak iWantSpeak = iWantSpeakClass.newInstance(); //必须获取这个类的实例对象,new()也行,而且这个类必须要无参的构造方法,你要是写了有参数的构造你必须把默认的无参也加上。不然是获取不到实例对象的。 iWantSayHello.invoke(iWantSpeak); //方法对象使用invoke的时候参数必须是这个类的实例对象,如果直接扔这个对象的话会报错object is not an instance of declaring class什么的。
运行结果如
先实例化,然后执行了iWantSayHello该方法。Method iWantSayHello = iWantSpeakClass.getDeclaredMethod("iWantSayWhat", String.class); //这里调用的iwatsywhat方法是有参数的,这里获得方法对象时增加参数类型的对象参数。 IWantSpeak iWantSpeak = iWantSpeakClass.newInstance(); //同样获得实例对象 iWantSayHello.invoke(iWantSpeak, "sb"); //调用invoke的时候再传一个参数就相当于放到了方法对象中
运行结果如下