黑马程序员技术交流社区

标题: 反射笔记 [打印本页]

作者: fightingwang    时间: 2015-3-5 09:00
标题: 反射笔记
Constructor类
Constructor类代表某个类中的一个构造方法
得到某个类多有的构造方法:
例子:Constructor[] constructor=Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:
例子:Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);
创建实例对象:
通常方式:String str=new String(new StringBuffer("abc"));
反射方式:String str=(String)constructor.newInstance(new StringBuffer("abc"));
Class.newInstance()方法:
例子:String obj=(String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象
该方法内部的具体代码是怎样写得呢?用到了缓存机制来保存默认构造方法的实例对象


Field类
Field类代表某个类中的一个成员变量
演示用eclipse自动生成java类的构造方法
问题:得到的Field对象是对应的类上面的成员变量,还是对应到对象上的成员变量呢?类只有一个,而该类的实例对象有多个
如果是与对象关联,那关联的是哪个对象呢?所以字段fieldX代表的是x的定义,而不是具体的x变量
作业:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"a"


Method类
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对象的invoke()方法的一个参数为null,这有着什么样的意义呢?说明该Method
                                对象对应的是一个静态方法。
用反射方式执行某个类中的main方法
目标:写一个程序,这个程序能够根据用户提供的类名,去执行类中的main方法
问题:启动java程序的main方法的参数是一个字符串数组,通过反射方式来调用这个main方法时,如何为invoke方法传参数呢?按JDK1.5
的语法,整个数组是一个参数,而按JDK1.4的语法,数组中的每一个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法
时,javac到底会按那种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成若干个单独的参数
。所以,再给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"});编译器会做特殊处理,编译时不把参数当做数组看待,也就不会把数组打散成
若干个参数了
作者: 习惯就好    时间: 2015-3-5 09:50
不错  总结的!
作者: 笑望长空,逆转    时间: 2015-3-5 21:34
总结,挺全面的。
作者: ZZGFF    时间: 2015-3-5 22:35
还没学到。赞一下。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2