使用 Java 反射从内部 class 修改嵌套 class 的字段

Using Java reflection to modify nesting class's fields from inner class

我在 Eclipse 中调试我的 Java 反射作业时遇到了奇怪的行为。 我定义了 2 classes:

public class OuterClass{
    protected Person person;

    public void aPerson(Integer age) {
        person = new Person(age);
    }
}

public class OuterDerivedClass extends OuterClass {

    public class InnerClass extends OuterClass {

        public void aPerson(Integer age) {
            person = new Person(age);
        }
    }
}

在我的程序中的某个时刻,我像这样实例化了一个 InnerClass 实例(使用反射,因为我的程序应该在 any class 上工作。嵌套 classes 可以是 static/non-static 和 public/private/protected):

Class<?> outer_class = outer_instance.getClass();
Constructor<?> ctor = inner_class.getDeclaredConstructor(outer_class);
Object inner_instance = ctor.newInstance(outer_instance);

稍后我调用了 OuterDerivedClass$InnerClass.aPerson 方法:

method.invoke(inner_instance, parameter);

现在,似乎一切顺利:成功创建了 inner_instance,调用了正确的 aPerson 方法(InnerClass 中的方法)。但是,稍后在我的程序中,当我试图从 outer_instance 访问 person 字段时,我发现它仍然是 NULL(尽管它是在 aPerson 方法中创建的)。 在 Eclipse 中调试时,我发现了这一点:

(PersonStoryDe​​rivedTest == OuterDerivedClass 在我的问题中)。

这个$0的id和我发给构造器的id一样(outer_instance)。我不知道什么是第二人称字段(显然是通过调用 aPerson 创建的)。这个字段不是应该只存在于嵌套 class 中吗?我的意图是调用 OuterDerivedClass$InnerClass.aPerson 会改变 outer_instance 中的 person 字段(我认为这就是它首先被发送到构造函数的原因)。

有人可以澄清这些问题吗?谢谢!

I couldn't figure out what is the second person field

嗯,自从

public class InnerClass extends OuterClass {
//                      ^^^^^^^^^^^^^^^^^^

您的 InnerClass 也继承了自己的 person 字段,该字段由

设置
public void aPerson(Integer age) {
    person = new Person(age);
}

因为 person 指的是 this.personthis 在这个方法中代表 class 的实例,其中方法被实现(在 InnerClass 中)。

如果您希望您的方法初始化 OuterClass#person 字段,您需要通过 OuterDerivedClass.this.person 引用它,但这将留下 InnerClass 的未初始化 person 字段。

其他(更简单的)选项未从 InnerClass 扩展 OuterClass

public class InnerClass{