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

© 攻城狮 黑马帝   /  2012-4-7 22:08  /  3446 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李南江 于 2012-4-10 12:02 编辑

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("")同样的方法呢?

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

8 个回复

正序浏览
pray 高级黑马 2014-4-26 04:42:18
9#
楼主,支持!
回复 使用道具 举报
攻城狮 黑马帝 2012-4-10 17:36:49
8#
为什么最近没有版主加分?
回复 使用道具 举报
已经解决 感谢楼上所有人···{:soso__2640336074117299927_3:}
回复 使用道具 举报
在一个类中考虑到安全(权限)问题,所以有些不希望被外部直接访问的变量或者方法都是用private关键字来包装的,
getField("")得到的是public类型的字段(成员变量),而被private修饰了的成员变量则要用getDeclaredField("")才能得到相应的字段
这时字段虽然是可见了,但是还不能用,必须通过field.setAccessible(true) ;来设置让他可以被操作,这就是暴力反射
类中的方法也和成员变量一个道理:
getMethod("")得到的是public类型的方法,而被private修饰了的成员方法则要用getDeclaredMethod("")才能得到相应的方法
回复 使用道具 举报
getMethod("");  ::这个反射是用于 返回公共的字段(public)

getDeclaredMethod();  ::这个方法是返回私有的..private
然后你还要设置的setAccessible(true);这个方法  就俗称:暴力反射    这样你就能反射私有的了....
回复 使用道具 举报
getField(String name)
          返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

getDeclaredField

          返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
回复 使用道具 举报
楼上正解,私有成员是不能被访问的  getDeclaredField(“ ”)   可以理解为强制获得 引号里面变量的对象   
回复 使用道具 举报
getDeclaredField() 这个用于 在自己类中定义的private 类型的成员变量
其它的情况下的 成员变量均能用 getField() 方法得到

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马