我正在尝试通过反射来修改抽象类中的私有字段。
我已经成功完成了常规课程,但是在这种情况下,我的代码无法正常工作:

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

10-02 00:33
查看更多