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

Java 使用反射修改抽象类中的字段,java,testing,reflection,junit,Java,Testing,Reflection,Junit,我试图用反射修改抽象类中的私有字段。 我已经成功地使用了一个常规类,但在这种情况下,我的代码不起作用: public abstract class AbstractClass{ private String str; public void func1(){ //... } } public MyClass extends AbstractClass{} // JUnit MyClass tester = new MyClass(); Class<

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

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;
公共图书馆1({
//...
}
}
公共MyClass扩展了抽象类{}
//朱尼特
MyClass tester=新的MyClass();
Class secretClass=tester.getClass();
字段字段[]=secretClass.getDeclaredFields();
@以前
公共作废设置(){
用于(字段:字段){
试一试{
字段。setAccessible(true);
if(field.getName().equals(“str”)){
field.set(tester,“Hello”);
System.out.println(field.getName());
}
}捕获(IllegalArgumentException | IllegalAccessException e){
e、 printStackTrace();
}
}
}
//一些测试
@试验
公共void testFunc1(){
//tester.func1();
}
它无法访问
AbstractClass
中的字符串
str
。这里没有显示输出。如果我将
str
复制到
MyClass
,它就可以工作。

javadoc for states

返回反映所有声明字段的字段对象数组 通过该类对象表示的类或接口。这 包括公共、受保护、默认(包)访问和私有 字段,但不包括继承的字段

因此,返回的数组中不包括字段
str
。您必须递归(或迭代)遍历父类及其字段。如果字段是公共的,您可以使用状态的javadoc

返回反映所有声明字段的字段对象数组 通过该类对象表示的类或接口。这 包括公共、受保护、默认(包)访问和私有 字段,但不包括继承的字段

因此,返回的数组中不包括字段
str
。您必须递归(或迭代)遍历父类及其字段。如果字段是公共的,您可以使用状态的javadoc

返回反映所有声明字段的字段对象数组 通过该类对象表示的类或接口。这 包括公共、受保护、默认(包)访问和私有 字段,但不包括继承的字段

因此,返回的数组中不包括字段
str
。您必须递归(或迭代)遍历父类及其字段。如果字段是公共的,您可以使用状态的javadoc

返回反映所有声明字段的字段对象数组 通过该类对象表示的类或接口。这 包括公共、受保护、默认(包)访问和私有 字段,但不包括继承的字段


因此,返回的数组中不包括字段
str
。您必须递归(或迭代)遍历父类及其字段。如果字段是公共的,则可以使用。

抽象类中的字段是私有的。是否有机会访问和修改这些字段?如何测试抽象类?@user1170330如我所述,访问具体子类的父类并使用其
getDeclaredFields()
方法。测试和抽象类取决于类本身。测试具体的子类可能包括测试它们的父类。如何从子类中获得抽象类?是否有类似于
this.getAbstractClass()
的东西可以从子类调用?@user1170330如果您查看我在回答中链接的javadoc,您会找到一个方法。调用该函数,直到得到
null
,并在执行过程中检索(和修改)字段。抽象类中的字段是私有的。是否有机会访问和修改这些字段?如何测试抽象类?@user1170330如我所述,访问具体子类的父类并使用其
getDeclaredFields()
方法。测试和抽象类取决于类本身。测试具体的子类可能包括测试它们的父类。如何从子类中获得抽象类?是否有类似于
this.getAbstractClass()
的东西可以从子类调用?@user1170330如果您查看我在回答中链接的javadoc,您会找到一个方法。调用该函数,直到得到
null
,并在执行过程中检索(和修改)字段。抽象类中的字段是私有的。是否有机会访问和修改这些字段?如何测试抽象类?@user1170330如我所述,访问具体子类的父类并使用其
getDeclaredFields()
方法。测试和抽象类取决于类本身。测试具体的子类可能包括测试它们的父类。如何从子类中获得抽象类?是否有类似于
this.getAbstractClass()
的东西可以从子类调用?@user1170330如果您查看我在回答中链接的javadoc,您会找到一个方法。调用该函数,直到得到
null
,并在执行过程中检索(和修改)字段。抽象类中的字段是私有的。是否有机会访问和修改这些字段?如何测试抽象类?@user1170330如我所述,访问具体子类的父类并使用其
getDeclaredFields()
方法。测试和抽象类取决于类本身。测试具体的子类可能包括测试它们的父类。如何从子类中获得抽象类?是否有类似于
this.getAbstractClass()
的东西可以从子类调用?@user11