黑马程序员技术交流社区
标题:
牛人们,来帮忙解决了啊。这个反射到底出什么问题了。。
[打印本页]
作者:
chenlanaq
时间:
2015-3-29 11:01
标题:
牛人们,来帮忙解决了啊。这个反射到底出什么问题了。。
本帖最后由 chenlanaq 于 2015-3-29 16:55 编辑
将输出去掉注释,就会出异常。。
class clazz {
public static final Integer FINALOBJ=12345;
}
class MString {
public static void main(String[] args)throws Exception{
Field field=null;
field = clazz.class.getDeclaredField("FINALOBJ");
field.setAccessible(true);
// System.out.println(field.get(null));
setFinal(field,67890);
field.setAccessible(true);
System.out.println(field.get(null));
}
static void setFinal(Field field, Object newValue) throws Exception {
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(field, newValue);
}
}
复制代码
作者:
圣光忏悔
时间:
2015-3-29 12:44
参数传递错误,System.out.println(field.get(null));
get()里面要求传递的是该类的对象默认的object
Object obj = clazz.class.newInstance();
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