繁体   English   中英

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

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

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

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实例(使用反射,因为我的程序应该可以在任何类上使用。嵌套类可以是静态/非静态的,也可以是公共/私有/受保护的):

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

现在,似乎一切正常:内部实例成功创建,正确的aPerson方法(InnerClass中的一个)被调用。 但是,在稍后的程序中,当我尝试从external_instance访问person字段时,我发现它仍然为NULL(尽管它是在aPerson方法中创建的)。 在Eclipse中进行调试时,我发现了这一点:

在此处输入图片说明

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

这个$ 0的ID与我发送给构造函数的ID(outer_instance)相同。 我不知道什么是第二人称字段(该字段显然是通过调用aPerson创建的)。 该字段不应该仅在嵌套类中存在吗? 我的意图是,对OuterDerivedClass $ InnerClass.aPerson的调用将更改external_instance中的person字段(我认为这是将其首先发送给Constructor的原因)。

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

我不知道什么是第二人称领域

好吧,因为

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

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

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

因为person是指this.person并且this方法内部的this表示实现方法的类的实例(在InnerClass中)。

如果您想让方法初始化OuterClass#person字段,则需要通过OuterDerivedClass.this.person对其进行OuterDerivedClass.this.person ,但这将留下InnerClass未初始化person字段。

其他(简单)选项不延长OuterClassInnerClass

public class InnerClass{

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM