(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"});编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干参数了。
例如: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"});编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干参数了。
相关文章推荐
- Android(java)学习笔记109:通过反射获取成员变量和成员方法并且使用
- Java笔记——利用反射机制获取成员变量及成员方法
- java反射学习笔记(3)---使用Class来获取方法、成员变量、构造函数信息
- Java通过反射来获取类的私有构造方法和成员方法
- 深入理解 Java 反射:Method (成员方法)
- java开发之成员变量及成员方法的反射
- java反射之成员方法的反射
- java: 一些数字到字符的转换技巧,反射访问类成员数组的方法
- 深入理解 Java 反射:Method (成员方法)
- 深入理解 Java 反射:Method (成员方法)
- Android(java)学习笔记107-0:通过反射获得构造方法并且使用
- Java SE 自学笔记10 之 Java入口方法详解和读取键盘输入
- Java 反射(成员方法) 相当暴力啊 暴力反射
- 黑马程序员——自学笔记3(java中各种方法的特点)
- Java笔记 第四章(2)Java面向对象编程基础 第二部分(类的成员变量和方法)
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- 使用java反射操作类的构造函数,成员变量和成员方法
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
- Java反射笔记3—变量和方法