黑马程序员技术交流社区

标题: 反射的问题 [打印本页]

作者: 晓风妮子    时间: 2013-4-24 18:44
标题: 反射的问题
我在看视频讲到反射的时候,有这样的代码:
Class c = Class.forName(cn.itcast.02.Person);   //获取Person的字节码文件
Field field =c.getField("name");  //获取到Person对象中的name字段对象
Constructor con = c.getConstructor(); //获取到构造方法
Object obj = c.newInstance();   //获得对象
field.set(obj,"林青霞");
我不明白这里获得对象以后,为什么不向下转型,而是直接用作对象更改字段了呢?父类中没有name这个字段呀,这样用是什么原理呢?跪求各位大神了
作者: LINUS    时间: 2013-4-24 21:37
不懂就查一下 API

Constructor 类中的 newInstance()方法   
使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

它接收的参数是 Object...

                 // 给obj对象的field成员变量赋值
                // obj.field = "林青霞";
                // public void set(Object obj,Object value)
作者: 晓风妮子    时间: 2013-4-25 00:34
LINUS 发表于 2013-4-24 21:37
不懂就查一下 API

Constructor 类中的 newInstance()方法   

方法的确是这么定义的,但是JVM拿到obj这个对象的时候,怎么知道他就是Person对象的呢?
作者: 晓风妮子    时间: 2013-4-25 00:35
晓风妮子 发表于 2013-4-25 00:34
方法的确是这么定义的,但是JVM拿到obj这个对象的时候,怎么知道他就是Person对象的呢? ...

Object类里面有name这个字段吗?
作者: 袁梦希    时间: 2013-4-25 09:01
版主拎包郑重提示:如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主题的分类标记成“已解决”。就OK了{:soso_e102:}

作者: 黄玉昆    时间: 2013-4-25 13:54
1、其实这里需要强转的,因为在SUN公司设计这个newInstance()方法的时候,并不知道你要接收的是什么类型的值,所以返回的类型是所有类的根类Obejct。
2、你可以看到,你上面的field其实已经获取到了你自定义Person这个类的name字段了,既然已经将字段存入了field这个对象里(不严格意义上成field为对象,这个你懂的),那么当然存在了name字段了。所以你在调用field.set()方法的时候,当然可以直接更改了。
3、其实反射是很强大的,可以获取类中的几乎全部的成员。但是反射也是很脆弱的。所以一般不使用框架,是不建议用反射的。希望对你有帮助。谢谢




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