[英]Modifying field in abstract class using reflection
我正在嘗試通過反射來修改抽象類中的私有字段。
我已經成功完成了常規課程,但是在這種情況下,我的代碼不起作用:
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
的String str
。 這里沒有顯示輸出。 如果我將str
復制到MyClass
,則可以。
Class#getDeclaredFields()
的Javadoc狀態
返回一個Field對象數組,該數組反映由該Class對象表示的類或接口聲明的所有字段。 這包括公共,受保護的,默認(程序包)訪問和私有字段, 但不包括繼承的字段 。
因此,字段str
不包含在返回的數組中。 您將必須遞歸(或迭代)遍歷父類及其字段。 如果這些字段是public
,則可以使用getFields()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.