2009-07-02 28 views
9

Il mio Java è arrugginito, quindi per favore portami con me. In C che posso fare:Uso della classe corrente nella dichiarazione del metodo statico Java

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

In Java, posso lessicalmente arrivare al nome o classe del tipo di corso di definizione. Per esempio, se ho:

import org.apache.log4j.Logger; 

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

sembra sbagliato ripetere "myClass" nell'argomento getLogger(). Voglio "getLogger (__ CLASS__)" o "getLogger (this.class)" o qualcosa del genere. (So ​​che entrambi sono stupidi ma dovrebbero puntare a ciò che sto cercando.) Il compilatore Java non sa davvero quale classe è nel mezzo di quando elabora l'origine?

+0

Si potrebbe anche avere come variabile di istanza e l'uso "this.getClass()". Usare l'attributo di istanza sarebbe un'idea migliore, a meno che ovviamente non ne abbia davvero bisogno come attributo di classe. – OscarRyz

+0

il compilatore sa che classe è, ma non sapevi quale classe stai scrivendo? scusa, sto scherzando ... Ho avuto questo problema - quasi lo stesso codice - ma non ho trovato niente di meglio di MyClass.class: -/ho bisogno di avere un IDE carino con i modelli di codice e refactoring ... –

+0

Desidero Java aveva questo. Consiglierei la sintassi 'static.class'. – Boann

risposta

9

Sfortunatamente, non esiste un modo più semplice se si è in un contesto static (come sei qui). Se il logger fosse una variabile di istanza, potresti usare getClass(), ma poi dovresti preoccuparti delle sottoclassi.

In questo caso particolare, un'alternativa è utilizzare log5j. log5j è un wrapper attorno a log4j con metodi di convenienza come getLogger(), che deduce la classe corretta camminando in cima allo stack. Quindi il tuo codice diventerebbe:

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

Ed è possibile copiare e incollare la stessa dichiarazione in tutte le classi senza problemi.

6

Non ho potuto resistere.

Ecco l'attuazione di ciò che si riferisce mmyers ma fatti in casa :)

Fondamentalmente si lancia un'eccezione e ottenere il secondo elemento dello stack per ottenere il nome della classe.

Continuo a pensare che sia meglio averlo come membro di istanza.

:)

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(); 
    } 
} 

Usage:

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

Sembra proprio come il mio involucro per la registrazione in casa. :) –

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

modo IMHO più pulito per ottenere dello stack trace

Problemi correlati