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



我试图用反射修改抽象类中的私有字段
我已经成功地完成了一个普通类,但在这种情况下,我的代码不起作用:

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()

相关内容

  • 没有找到相关文章

最新更新