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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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. }
复制代码



3 个回复

倒序浏览
参数传递错误,System.out.println(field.get(null));
get()里面要求传递的是该类的对象默认的object
  1.                 Object obj = clazz.class.newInstance();
  2.                 System.out.println(field.get(obj));
复制代码

这样,就能获得该成员变量的值了.
回复 使用道具 举报 0 1
本帖最后由 chenlanaq 于 2015-3-29 13:27 编辑

静态的不需要object的,可以直接null的。两次输出,注释掉一次就是正常的,同时都输出的话,就是异常。
回复 使用道具 举报
本帖最后由 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)。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马