2015-09-25 167 views
1

對不起,這個問題可能很奇怪,但前一段時間我使用了python的自省,我想知道在Java 1.8中是否可以使用類似的東西。屬性對象是否可以到達它屬於的對象?

所以我們可以說我有一個對象aA類在這樣

class A{ B b; } 
class B{ public void f(){} } 

我的問題是一個風雲「可以f()瞭解a?」

顯然,就可以了,如果我添加一個反向鏈接,類似:

class A { 
    B b; 
    public A() { b = new B(this); } 
} 

class B { 
    A father; 
    public B(A a){ this.father = a; } 
    public void f(){} 
} 

但我的問題是,在常規設置,不喜歡father左右回來,有沒有自省機修工那可能讓f()知道關於a

+1

'A a = new A; B b2 = a.b;'現在你會得到什麼結果? –

+0

爲什麼你需要那個場景 –

+2

簡短的回答:沒有。長答案:沒有。 –

回答

1

您希望訪問調用堆棧中函數upper的參數。在香草Java中,你不能完成這個任務,但是你可以使用一些AOP框架,它可以維護一個影子堆棧,所以你可以反思它。

或者你可能使用內部類。內部類包含外部類的實例的隱藏字段。可以通過語法OuterClass.this訪問它。

class A{ 
    public class B{ 
    public void f() { 
     System.out.println(A.this.aField); 
    }  
    } 
    String aField; 
    B b = new B(); // Passes a hidden `this` parameter 
} 
+1

這不是他正在談論的場景 - 他談論的情況是A和B完全不相關,而不是B是A中的內部類的情況 –

0

你不能那樣做。如果B是A的成員,則意味着A'知道'B,但不是相反。你只能從A訪問B,而不是相反。

1

如果A和B位於同一個包中,B知道A內的域b暴露給B.這是可能的,因爲您在A中聲明瞭域B,其默認可見性爲「對包是私有的」 。

否則,如果你改變一種用於

class A{ private B b; 
     public A(){ b=new B(this); } 
    } 

然後,你只能從使用反射像這樣訪問字段B(假設這個代碼是在一個方法中B:

Field privateStringField = A.class.getDeclaredField("b"); 
privateStringField.setAccessible(true); 

B value = (B) privateStringField.get(this); 

現在,這是一個壞主意,因爲你在A中更改字段「b」的名稱,然後破壞了代碼,編譯器也不會告訴你。

0

(我自己刪除了這條評論,問題解決了)