2008-11-12 7 views
8

Supposons que j'ai une classe Java avec une méthode statique, comme ceci:Quelle classe a appelé ma méthode statique?

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

Et suppose en outre que la classe a un nombre arbitraire de sous-classes:

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

Considérons maintenant les invocations de méthodes suivantes :

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

Ma question est, comment méthode peut foo() dire quelle classe est l'invoquer?

Répondre

10

Il ne peut pas, et cela fait partie du problème avec les méthodes statiques. En ce qui concerne le compilateur A.foo() et B.foo() sont exactement la même chose. En fait, ils compilent jusqu'au même octet. Vous ne pouvez pas obtenir plus similaire que cela.

Si vous avez vraiment besoin de ce type d'informations, utilisez un singleton et entrez foo() dans une méthode d'instance. Si vous aimez toujours la syntaxe statique, vous pouvez créer une façade A.foo().

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

Bien que vous ne pouvez pas savoir quelle classe la méthode statique a été invoqué sur , il est possible de savoir quelle classe effectivement invoquaient la méthode lors de l'exécution:

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) 
    { 
    } 
} 

I Je ne dis pas que c'est une bonne pratique et ce n'est probablement pas très bon du point de vue de la performance non plus, mais cela devrait fonctionner. Je ne sais pas si cela vous aide ...

+0

Yuck. Ça marche; mais la réflexion de l'IIRC a été délibérément faite laide pour décourager ce genre de choses. – jamesh

+0

Je cherchais un moyen d'écrire une méthode utilitaire statique 'trace (String s)' telle que, si une méthode de la classe Foo invoquait 'trace (" hi ")', elle écrirait dans SYSOUT: ** Foo: hi **. Cela semble faire l'affaire. – Chap

Questions connexes