2013-05-14 61 views
0

我想知道在Java中調用另一個類中的方法的對象的類型,例如, :在Java中調用方法的類的查找類型

class A{ 
    public A(){ 
    //.. 
    } 
    public void method1{ 
     //here I'd like to find what's the type of the object which is calling this method 
    } 
    } 

    class B{ 
    public B(){ 
     A a = new A(); 
     a.method1(); 
    } 
    } 

    class C{ 
    public C(){ 
     A a = new A(); 
     a.method1(); 
    } 
    } 
+2

這使我的心是拋出一個異常,分析堆棧跟蹤的唯一的事,但是這將是一個可怕的做法 – 2013-05-14 14:39:05

+0

這是不太可怕,如果只需要簡單的例外。你不需要扔掉它。但是,您可以詢問當前的線程來替代它的堆棧 – 2013-05-14 14:43:24

+1

爲什麼你需要知道這個?我對你可能做的事情隱約感到恐懼,而不是通過傳遞某種枚舉標誌來完成。您將創建一些非常脆弱,緊密耦合的代碼。 – 2013-05-14 15:03:08

回答

4

您可以通過在調用代碼的方法時檢查堆棧來做到這一點。退房Thread.getStackTrace()並使用當前線程通過

Thread.currentThread() 

返回的你可以以你的方式備份堆棧跟蹤陣列,並確定呼叫者的鏈條。請注意,但是需要注意的文件中:

某些虛擬機可能,在某些情況下,從堆棧跟蹤缺少一個或多個 堆棧幀。在極端情況下,虛擬 機器沒有關於此線程的堆棧跟蹤信息,因此 被允許從此方法返回一個零長度的數組。

如果你需要找出誰調用你的類的子集,我會改變類,它們實現一些Caller/Callee接口,從而實現方法簽名:

public void doSomething(..., Caller caller); 

哪裏您的呼叫類實施Caller。這樣你就可以執行一些相對類型安全的方法調用和參數傳遞。

+0

那麼這些機器應該做什麼? – 2013-05-14 14:48:23

+0

這意味着你無法找到誰在這些機器上調用你的代碼 – 2013-05-14 15:06:56

2

試試這個:

Thread.currentThread().getStackTrace() 
相關問題