我试图用反射修改抽象类中的私有字段
我已经成功地完成了一个普通类,但在这种情况下,我的代码不起作用:
public abstract class AbstractClass{
private String str;
public void func1(){
//...
}
}
public MyClass extends AbstractClass{}
// JUnit
MyClass tester = new MyClass();
Class<?> secretClass = tester.getClass();
Field fields[] = secretClass.getDeclaredFields();
@Before
public void setup() {
for (Field field : fields) {
try {
field.setAccessible(true);
if (field.getName().equals("str")) {
field.set(tester, "Hello");
System.out.println(field.getName());
}
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
// some testing
@Test
public void testFunc1() {
//tester.func1();
}
它无法访问AbstractClass
中的字符串str
。此处未显示任何输出。如果我将str
复制到MyClass
,它会起作用。
Class#getDeclaredFields()
的javadoc状态为
返回一个Field对象数组,该数组反映声明的所有字段由该class对象表示的类或接口。这包括公用、受保护、默认(包)访问和专用字段,但不包括继承的字段。
因此,字段str
不包括在返回的数组中。您必须递归地(或迭代地)遍历父类及其字段。如果字段为public
,则可以使用getFields()
。