2008-11-12 47 views
8

假設我有一個Java類的靜態方法,像這樣:哪個類調用了我的靜態方法?

 
class A 
{ 
    static void foo() 
    { 
     // Which class invoked me? 
    } 
} 

並進一步假設A類有子類的任意數量:

 
class B extends A { } 
class C extends A { } 
class D extends A { } 
... 

現在考慮下面的方法調用:

 
A.foo(); 
B.foo(); 
C.foo(); 
D.foo(); 
... 

我的問題是,如何能方法foo()知道哪些類被調用呢?

回答

10

它不能,這是靜態方法的問題的一部分。就編譯器而言A.foo()B.foo()是完全一樣的東西。實際上,它們編譯爲相同的字節碼。你不能比這更類似。

如果您確實需要這種信息,請使用單例並將foo()轉換爲實例方法。如果您仍然喜歡靜態語法,則可以構建一個門面A.foo()

3
class A 
{ 
    static void foo(A whoIsCalingMe) 
    { 
     // Which class invoked me? 
    } 
} 
4

雖然你不能找出哪些類中的靜態方法調用上,就可以找出哪些類實際上調用在運行時的方法:

static void foo() 
{ 
    Throwable t = new Throwable(); 
    StackTraceElement[] trace = t.getStackTrace(); 
    String className = trace[1].getClassName(); 
    Class whoCalledMe = null; 
    try 
    { 
     whoCalledMe = Class.forName(className); 
    } 
    catch(Exception e) 
    { 
    } 
} 

我這並不是說這是好的做法,從績效的角度來看也可能不是很好,但它應該可行。不知道這是否有助於你...

+0

Yuck。有用;但是IIRC的反思故意醜陋地勸阻這些事情。 – jamesh 2008-11-12 12:47:55