您的位置:首页 > 编程语言 > Java开发

(JAVA自学笔记)成员方法的反射

2013-01-20 23:08 267 查看
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"});编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干参数了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐