簡體   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