A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 晓风妮子 中级黑马   /  2013-4-24 18:44  /  1264 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我在看视频讲到反射的时候,有这样的代码:
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这个字段呀,这样用是什么原理呢?跪求各位大神了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

倒序浏览
不懂就查一下 API

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

它接收的参数是 Object...

                 // 给obj对象的field成员变量赋值
                // obj.field = "林青霞";
                // public void set(Object obj,Object value)

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
LINUS 发表于 2013-4-24 21:37
不懂就查一下 API

Constructor 类中的 newInstance()方法   

方法的确是这么定义的,但是JVM拿到obj这个对象的时候,怎么知道他就是Person对象的呢?
回复 使用道具 举报
晓风妮子 发表于 2013-4-25 00:34
方法的确是这么定义的,但是JVM拿到obj这个对象的时候,怎么知道他就是Person对象的呢? ...

Object类里面有name这个字段吗?
回复 使用道具 举报
版主拎包郑重提示:如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主题的分类标记成“已解决”。就OK了{:soso_e102:}

点评

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