反射修改对象属性问题

public class A{
    B b;
    
    A(){
        b = new B();
        b.xxx();
        //b做了很多初始化
    }

    private static class B{
        static final int v = 0;
    }
}

要修改b中的v,尝试代码如下

A a = new A();

Class<?> cls = a.getClass();
Field mTNField =cls.getDeclaredField("b");

Class<?> mTnCls  = mTNField.getType();
Field mTnDurationField =mTnCls.getDeclaredField("v");
mTnDurationField.setAccessible(true);

//下面方法的第一个参数需要一个B 对象,但是这个对象应该怎么拿到呢?
mTnDurationField.setInt(mTNField.getType().clone(),999);
阅读 5.6k
4 个回答
        Field field = b.getClass().getDeclaredField("v");
        field.setAccessible(true);
        field.setInt(null, 1);
        System.out.println(b.v);

finalJVM 启动后就不能改动了,所以要去掉。

对于静态属性直接置空即可:
field.setInt(null, 1);

A a = new A();

        Class<?> cls = a.getClass();
        Field mTNField =cls.getDeclaredField("b");

        Class<?> mTnCls  = mTNField.getType();
        Field mTnDurationField =mTnCls.getDeclaredField("v");
        mTnDurationField.setAccessible(true);

        //下面方法的第一个参数需要一个B 对象,但是这个对象应该怎么拿到呢?
        Constructor<?> c=mTnCls.getDeclaredConstructors()[0];
        c.setAccessible(true);
        mTnDurationField.setInt(c.newInstance(),999);

去掉final修饰符,使用 T newInstance(Object... initargs) 得到对象实例。

      使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。 
NullPointerException   if the specified object is null and the field is an instance field.

java.lang.NullPointerException: null receiver
 at java.lang.reflect.Field.setInt(Native Method)

不能接收空值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题