我正在尝试通过反射来修改抽象类中的私有字段。
我已经成功完成了常规课程,但是在这种情况下,我的代码无法正常工作:
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();
}
它无法访问
str
中的字符串AbstractClass
。这里没有显示输出。如果我将str
复制到MyClass
,则可以。 最佳答案
Class#getDeclaredFields()
状态的Javadoc
返回反映所有已声明字段的Field对象数组
通过此Class对象表示的类或接口。这个
包括公共,受保护,默认(程序包)访问和私有
字段,但不包括继承的字段。
因此,字段str
不包含在返回的数组中。您将必须递归(或迭代)遍历父类及其字段。如果字段是public
,则可以使用getFields()
。