2009-07-02 5 views
9

Mi Java está oxidada así que por favor ten paciencia conmigo. En C que puedo hacer:Usando la clase actual en la declaración de método estático de Java

int someFunc(void) 
{ 
    printf("I'm in %s\n", __func__); 
} 

En Java, puedo léxico llegar al nombre o la clase del tipo definido en ese momento. Por ejemplo, si tengo:

import org.apache.log4j.Logger; 

class myClass { 
    private static final Logger logger = Logger.getLogger(myClass.class); 
... 
} 

Parece erróneo repetir "myClass" en el argumento getLogger(). Quiero "getLogger (__ CLASS__)" o "getLogger (this.class)" o algo así. (Sé que ambos son tontos, pero deben señalar lo que estoy buscando). ¿El compilador de Java realmente no sabe a qué clase se encuentra en el medio mientras procesa el código fuente?

+0

También podría tener como variable de instancia y utilizar "this.getClass() ". Usar el atributo de instancia sería una mejor idea, a menos, por supuesto, que realmente lo necesite como un atributo de clase. – OscarRyz

+0

el compilador sabe qué clase es, pero ¿no sabías qué clase estás escribiendo? lo siento, es broma ... tuve ese problema - casi el mismo código - pero no he encontrado nada mejor que MyClass.class: -/necesito tener un buen IDE con plantillas de código y refactorización ... –

+0

Ojalá Java tenía esto. Yo recomendaría la sintaxis 'static.class'. – Boann

Respuesta

9

Lamentablemente, no hay una manera más fácil si se encuentra en un contexto static (como lo es aquí). Si el registrador fuera una variable de instancia, podría usar getClass(), pero entonces tendría que preocuparse por las subclases.

En este caso particular, una alternativa es usar log5j en su lugar. log5j es un contenedor alrededor de log4j con métodos de conveniencia como getLogger(), que infiere la clase correcta subiendo la pila. Entonces su código sería:

import com.spinn3r.log5j.Logger; 
class myClass { 
    private static final Logger logger = Logger.getLogger(); 
    ... 
} 

Y puede copiar y pegar la misma declaración en todas sus clases sin ningún problema.

6

No pude resistirme.

Aquí está la implementación de lo que se refiere mmyers pero hecha en casa :)

Básicamente se producirá una excepción y obtener el segundo elemento de la pila para obtener el nombre de la clase.

Todavía creo que es mejor tenerlo como miembro de la instancia.

:)

package some.utility.packagename; 
import java.util.logging.Logger; 

import some.other.packagename.MyClass; 

public class LoggerFactory { 
    public static Logger getLogger() { 
     StackTraceElement [] s = new RuntimeException().getStackTrace(); 
     return Logger.getLogger(s[1].getClassName()); 
    } 
    public static void main (String [] args) { 
     MyClass a = new MyClass(); 
    } 
} 

Uso:

package some.other.packagename; 
import java.util.logging.Logger; 

import static some.utility.packagename.LoggerFactory.getLogger; 

public class MyClass { 

    private static final Logger logger = getLogger(); 
    static{ 
     System.out.println(MyClass.logger.getName()); 
    } 

} 
+0

Eso se parece a mi propio contenedor de registro casero. :) –

4
StackTraceElement[] trace = Thread.currentThread().getStackTrace(); 
return trace[2].getClassName(); 

manera más ordenada en mi humilde opinión para obtener seguimiento de la pila

Cuestiones relacionadas