使用 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 中调试时,我发现了这一点:
(PersonStoryDerivedTest == 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.person
而 this
在这个方法中代表 class 的实例,其中方法被实现(在 InnerClass 中)。
如果您希望您的方法初始化 OuterClass#person
字段,您需要通过 OuterDerivedClass.this.person
引用它,但这将留下 InnerClass
的未初始化 person
字段。
其他(更简单的)选项未从 InnerClass
扩展 OuterClass
:
public class InnerClass{
我在 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 中调试时,我发现了这一点:
(PersonStoryDerivedTest == 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.person
而 this
在这个方法中代表 class 的实例,其中方法被实现(在 InnerClass 中)。
如果您希望您的方法初始化 OuterClass#person
字段,您需要通过 OuterDerivedClass.this.person
引用它,但这将留下 InnerClass
的未初始化 person
字段。
其他(更简单的)选项未从 InnerClass
扩展 OuterClass
:
public class InnerClass{