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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 攻城狮 黑马帝   /  2012-4-7 22:08  /  3218 人查看  /  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 个回复

倒序浏览
getDeclaredField() 这个用于 在自己类中定义的private 类型的成员变量
其它的情况下的 成员变量均能用 getField() 方法得到

评分

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

查看全部评分

回复 使用道具 举报
楼上正解,私有成员是不能被访问的  getDeclaredField(“ ”)   可以理解为强制获得 引号里面变量的对象   
回复 使用道具 举报
getField(String name)
          返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

getDeclaredField

          返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
回复 使用道具 举报
getMethod("");  ::这个反射是用于 返回公共的字段(public)

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