2015-01-08 165 views
0

**我(一個類的一個實例)想知道哪個類實例化了我? 我有一個類C被類A和類B實例化。我想知道哪個類實例化了我,以便我可以訪問該類中的變量。有沒有辦法找出創建哪個類實例'this'

通常的方法是傳入一個標識符,嘿,我是從類A並傳入變量x在構造函數中爲C消耗適當的方式。

**

如:

public Class A 
{ 
    public int x; 

    public A() 
    { 
    C c = new C(); 
    } 
} 

public Class B 
{ 
    public int x; 

    public B() 
    { 
    C c = new C(); 
    } 
} 

public Class C 
{ 
    public CMethod() 
    { 
    // I want Access int x from the class that instantiated me. 

    if I know its B then B.x ... 
    } 
} 
+0

什麼是語言?添加標籤。 –

+0

它看起來像是java。我敢肯定,如果你是一個可怕的,可怕的人,你可以通過反思和犧牲山羊來實現這一點。 – Wug

回答

0

沒有辦法知道沒有一些黑客攻擊(見下文)。這看起來像一個接口的情況...類別A和B定義HasX有一個getX()方法。您可以將任何類傳遞給C的構造函數,該構造函數需要實現HasX的任何類。然後C可以調用任何一個對象的getX,並且它不需要知道它實際是哪種類型,但它會得到適當的X值。

public interface HasX { 
    public int getX(); 
} 

public class A implements HasX { 
    private int x; 

    public A() 
    { 
     C c = new C(this); 
    } 

    public int getX() { 
     return x; 
    } 
} 

public class B implements HasX { 
    private int x; 

    public B() { 
     C c = new C(this); 
    } 

    public int getX() { 
     return x; 
    } 
} 

public class C { 
    HasX hasX; 

    public C(HasX hasX) { 
     this.hasX = hasX; 
    } 

    public void doStuff() { 
     int x = hasX.getX(); 
    } 
} 

爲了雖然回答你原來的問題,它創建了一個對象的對象不存儲任何地方...但是,當C的構建找出類,你可以做一些黑客。下面是我曾經用於Logging實現的一些代碼,它可以通過回顧Throwable的漏洞來檢測誰是調用者。再次,這是不好的做法,但你問那麼... :)

來源:https://github.com/slipperyseal/atomicobjects/blob/master/atomicobjects-lang/src/main/java/net/catchpole/trace/PrintTrace.java

public C() { 
    String whoCalledMe = whereAmI(new Throwable()); 
} 

private String whereAmI(Throwable throwable) { 
    for (StackTraceElement ste : throwable.getStackTrace()) { 
     String className = ste.getClassName(); 
     // search stack for first element not within this class 
     if (!className.equals(this.getClass().getName())) { 
      int dot = className.lastIndexOf('.'); 
      if (dot != -1) { 
       className = className.substring(dot + 1); 
      } 
      return className + '.' + ste.getMethodName(); 
     } 
    } 
    return ""; 
} 

您可能需要編輯這個只返回類的名字,甚至做的Class.forName( )來解決實際的課程。

如果您想要實際的對象,並且每個類只有1個,您可以將Map中的對象放在classname上。但嘖嘖嘖嘖嘖嘖嘖什麼好:)

+0

感謝您的回覆。我知道界面是這裏的關鍵。我想知道是否有某種方式使用可能的反射來查明。我想看看我們可能擁有或缺乏的各種選擇。 我遇到了一些遺留代碼,這些遺留代碼沒有被編碼爲清晰的接口,我希望能夠根據誰發起該類動態更新某個計數器。 – coderocks

+0

通過向C的構造函數中添加一些代碼,您可以找到一種方法。我編輯了我的答案以包含它。 :) – slipperyseal

+0

那麼,這段代碼給你的類,而不是實際的對象。 – slipperyseal

相關問題