设置带反射的私有字段值

2022-08-31 10:11:45

我有2节课:和FatherChild

public class Father implements Serializable, JSONInterface {

    private String a_field;

    //setter and getter here

}

public class Child extends Father {
    //empty class
}

通过反射,我想在课堂上设置:a_fieldChild

Class<?> clazz = Class.forName("Child");
Object cc = clazz.newInstance();

Field f1 = cc.getClass().getField("a_field");
f1.set(cc, "reflecting on life");
String str1 = (String) f1.get(cc.getClass());
System.out.println("field: " + str1);

但我有一个例外:

线程“main” java.lang.NoSuchFieldException 中的异常:a_field

但是如果我尝试:

Child child = new Child();
child.setA_field("123");

它的工作原理。

使用 setter 方法,我有同样的问题:

method = cc.getClass().getMethod("setA_field");
method.invoke(cc, new Object[] { "aaaaaaaaaaaaaa" });

答案 1

要访问私有字段,您需要设置为 true。您可以将字段从超类中拉出。此代码的工作原理:Field::setAccessible

Class<?> clazz = Child.class;
Object cc = clazz.newInstance();

Field f1 = cc.getClass().getSuperclass().getDeclaredField("a_field");
f1.setAccessible(true);
f1.set(cc, "reflecting on life");
String str1 = (String) f1.get(cc);
System.out.println("field: " + str1);

答案 2

使用Apache Commons Lang 3中的FieldUtils

FieldUtils.writeField(childInstance, "a_field", "Hello", true);

强制它设置,即使字段是私有的。true