[英]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.