Method类代表某个类中的一个成员方法。得到类中的某个成员方法:
例如:Method charAt = Class.forName("java.lang.String").getMethod("charAt",int.class);
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));(如果传递给Method()方法的第一个参数为null,这说明该Method对象对应的是一个静态方法)
jdk1.4和jdk1.5的invoke方法的区别:
jdk1.5:public Object.invoke(Object obj.Object...args)
jdk1.4:public Object.invoke(Object obj.Object[] args),即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数。所以,调用charAt方法的代码也可以用jdk1.4改写为charAt.invoke("str",new.Object[]{1})形式。
用反射方式执行某个类中的main方法
目标:写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。
问题:启动java程序的main方法的参数是一个字符串数组,即public static void main(String[] args)通过反射方式来调用这个main方法,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而jdk1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,java会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,new String[]{"xxx"}),javac只把它当作jdk1.4的语法进行理解,而不把它当作jdk1.5语法解释,因此会出现参数类型不对的问题。
解决办法:
mainMethod.invoke(null,new Object[]{new String[]{"xxx"}});
mainMethod.invoke(null,(Object)new String[]{"xxx"});编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干参数了。