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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 范明正 黑马帝   /  2011-8-13 08:07  /  2089 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ReflectPoint pt1=new ReflectPoint(2, 4);
Field fieldY=pt1.getClass().getField("y");               
System.out.println("fieldY="+fieldY.get(pt1));
Field fieldX=pt1.getClass().getDeclaredField("x");               
fieldX.setAccessible(true);
System.out.println("暴力反射fieldX="+fieldX.get(pt1));

在这段代码中,上面两句话都是得到相应的值,但为什么不是用getField("")同样的方法呢?
[ 本帖最后由 范明正 于 2011-08-13  08:08 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

2 个回复

倒序浏览
黑马网友  发表于 2011-8-13 14:05:49
沙发
前者得到的是公有字段,包括父类的。后者能得到自身所有字段,不包括父类的。所以你可以看看那个类的定义。x必定是公有的。y则都行
回复 使用道具 举报
黑马网友  发表于 2011-8-13 14:52:08
藤椅

回复 楼主 的帖子

我们来看看帮助文档:
[b]Field getField(String name)
          返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。[color=Black][/color][/b]
查看你的ReflectPoint类,他的变量Y一定是公有的。类中的公共成员字段都可以用这个方法获得,说白了就是public 修饰的字段。那么如果这个字段是私有的使用这个方法是无法访问的。
那么再看看Class类中的getDeclearedField()方法:
[b]Field getDeclaredField(String name)
          返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。[/b]
用这个方法就能获得类或接口的所有字段,管他什么公有私有都统统拿来再说。有点抢的味道。
好了 现在终于能看到这个字段,那么System.out.println("暴力反射fieldX="+fieldX.get(pt1))
肯定报错。因为看到还没摸到。。
现在想摸到还得对这个字段进行一下处理,Field类继承自AccessibleObject这样一个类中有这样一个方法:
[b]void setAccessible(boolean flag)
          将此对象的 accessible 标志设置为指示的布尔值。[/b]
用这样一个方法处理完你就能摸到他了。人家私有的东西你抢来了,所以说叫暴力反射
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马