黑马程序员技术交流社区

标题: 牛人们,来帮忙解决了啊。这个反射到底出什么问题了。。 [打印本页]

作者: chenlanaq    时间: 2015-3-29 11:01
标题: 牛人们,来帮忙解决了啊。这个反射到底出什么问题了。。
本帖最后由 chenlanaq 于 2015-3-29 16:55 编辑

将输出去掉注释,就会出异常。。
  1. class clazz {
  2.         public static final Integer FINALOBJ=12345;
  3. }
  4. class MString {
  5.         public static void main(String[] args)throws Exception{
  6.                 Field field=null;
  7.                 field = clazz.class.getDeclaredField("FINALOBJ");
  8.                 field.setAccessible(true);
  9. //                System.out.println(field.get(null));
  10.                 setFinal(field,67890);
  11.                 field.setAccessible(true);
  12.                 System.out.println(field.get(null));
  13.         }

  14.             static void setFinal(Field field, Object newValue) throws Exception {
  15.                 Field modifiersField = Field.class.getDeclaredField("modifiers");
  16.                 modifiersField.setAccessible(true);
  17.                 modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
  18.                 field.set(field, newValue);
  19.             }
  20. }
复制代码




作者: 圣光忏悔    时间: 2015-3-29 12:44
参数传递错误,System.out.println(field.get(null));
get()里面要求传递的是该类的对象默认的object
  1.                 Object obj = clazz.class.newInstance();
  2.                 System.out.println(field.get(obj));
复制代码

这样,就能获得该成员变量的值了.
作者: chenlanaq    时间: 2015-3-29 13:24
本帖最后由 chenlanaq 于 2015-3-29 13:27 编辑

静态的不需要object的,可以直接null的。两次输出,注释掉一次就是正常的,同时都输出的话,就是异常。

作者: chenlanaq    时间: 2015-3-29 13:30
本帖最后由 chenlanaq 于 2015-3-29 13:32 编辑

If the underlying field is a static field, the obj argument is ignored; it may be null.
这个是get方法的注释里面的一句话。。而且异常是java.lang.IllegalAccessException,但是我已经在代码里设置了field.setAccessible(true)。。





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