[英]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中进行调试时,我发现了这一点:
(在我的问题中,PersonStoryDerivedTest == 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
字段。
其他(简单)选项不延长OuterClass
从InnerClass
:
public class InnerClass{
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.