2008-11-12 11 views
8

Supongamos que tengo una clase Java con un método estático, así:¿Qué clase invocó mi método estático?

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

y supongamos además que la clase A tiene un número arbitrario de subclases:

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

Consideremos ahora las siguientes invocaciones de métodos :

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

Mi pregunta es, ¿cómo puede decir qué método foo() clase está invocando?

Respuesta

10

No puede, y eso es parte del problema con los métodos estáticos. En lo que respecta al compilador, A.foo() y B.foo() son exactamente lo mismo. De hecho, compilan hasta el mismo bytecode. No puedes ser más similar que eso.

Si realmente necesita este tipo de información, use un singleton y convierta foo() en un método de instancia. Si todavía le gusta la sintaxis estática, puede crear una fachada A.foo().

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

Aunque no se puede averiguar qué clase el método estático se invoca en , es posible averiguar qué clase de hecho invoca el método en tiempo de ejecución:

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 No estoy diciendo que esto sea una buena práctica y probablemente tampoco sea excelente desde el punto de vista del rendimiento, pero debería funcionar. No sé si eso te ayuda ...

+0

Yuck. Funciona; pero la reflexión del IIRC se hizo deliberadamente fea para desalentar este tipo de cosas. – jamesh

+0

Estaba buscando una forma de escribir un método de utilidad estático 'trace (String s)' de modo que, si un método en la clase Foo invocó 'trace (" hi ")', escriba a SYSOUT: ** Foo: hola **. Esto parece hacer el truco. – Chap

Cuestiones relacionadas