黑马程序员技术交流社区

标题: 反射问题_getField("")(已解决) [打印本页]

作者: 攻城狮    时间: 2012-4-7 22:08
标题: 反射问题_getField("")(已解决)
本帖最后由 李南江 于 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("")同样的方法呢?
作者: 宋蕈    时间: 2012-4-7 22:17
getDeclaredField() 这个用于 在自己类中定义的private 类型的成员变量
其它的情况下的 成员变量均能用 getField() 方法得到
作者: 贠(yun)靖    时间: 2012-4-7 22:30
楼上正解,私有成员是不能被访问的  getDeclaredField(“ ”)   可以理解为强制获得 引号里面变量的对象   
作者: newlaw2013    时间: 2012-4-7 22:30
getField(String name)
          返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

getDeclaredField

          返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
作者: 金兴    时间: 2012-4-7 23:20
getMethod("");  ::这个反射是用于 返回公共的字段(public)

getDeclaredMethod();  ::这个方法是返回私有的..private
然后你还要设置的setAccessible(true);这个方法  就俗称:暴力反射    这样你就能反射私有的了....
作者: 邓海涛    时间: 2012-4-7 23:32
在一个类中考虑到安全(权限)问题,所以有些不希望被外部直接访问的变量或者方法都是用private关键字来包装的,
getField("")得到的是public类型的字段(成员变量),而被private修饰了的成员变量则要用getDeclaredField("")才能得到相应的字段
这时字段虽然是可见了,但是还不能用,必须通过field.setAccessible(true) ;来设置让他可以被操作,这就是暴力反射
类中的方法也和成员变量一个道理:
getMethod("")得到的是public类型的方法,而被private修饰了的成员方法则要用getDeclaredMethod("")才能得到相应的方法

作者: 攻城狮    时间: 2012-4-9 18:46
已经解决 感谢楼上所有人···{:soso__2640336074117299927_3:}
作者: 攻城狮    时间: 2012-4-10 17:36
为什么最近没有版主加分?
作者: pray    时间: 2014-4-26 04:42
楼主,支持!




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