簡體   English   中英

使用反射修改抽象類中的字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM