2009-07-01 9 views
4

Possible en double:
Getting the class name from a static method in JavaEst-il possible d'obtenir le nom de la classe à partir d'une méthode statique?

Lorsque vous êtes à l'intérieur d'une méthode statique, est-il un moyen d'obtenir le nom de la classe (une chaîne contenant le nom) sans avoir à taper le nom de classe lui-même?

Par exemple, en tapant MyClass.class.getName() n'est pas plus utile que juste "Myclass".

+0

Une méthode statique n'est associée qu'à la classe dans laquelle elle est déclarée. Il me semble qu'il n'est pas nécessaire de avoir un moyen d'accéder à la classe autre que le référencer explicitement par son nom. –

Répondre

11

Vous pouvez le faire en créant (sans lancer) une nouvelle exception et en inspectant la trace de la pile. Votre classe sera l'élément zéro car c'est l'origine de l'Exception. C'est un peu faux, mais ça va marcher.

System.out.println(new Exception().getStackTrace()[0].getClassName()); 

Vous pouvez faire la même chose avec la classe Thread. Cela me semble plus propre, mais la ligne est légèrement plus longue. Votre classe est maintenant le premier élément de la pile plutôt que le zéro. Thread.getStackTrace() est le zéro.

System.out.println(Thread.currentThread().getStackTrace()[1].getClassName()); 

Par exemple, en tapant MyClass.class.getName() est plus utile que juste "Myclass".

Au contraire, si vous renommez MyClass en utilisant la fonction de refactoring de votre IDE, il remplacera MyClass.class.getName() avec RenamedClass.class.getName(). Si vous mettez une chaîne, vous devrez le faire manuellement.

+0

oh ... Ok. C'est un moyen plus sûr, mais il faut quand même taper le nom de la classe. C'est ce que j'essayais d'éviter. –

+0

De votre réponse et celle des autres, je vois que le langage ne fournit pas un moyen propre de le faire, donc je ne pense pas qu'il vaut la peine de taper une telle phrase laide, vu les quelques inconvénients que le nom de classe a (redondance, principalement) . –

13

Vous pouvez utiliser une classe interne anonyme:

class Test { 
    public static void main(String[] args) { 
    String className = new Object(){}.getClass().getEnclosingClass().getName(); 
    System.out.println(className); 
    } 
} 
1

Si elle est juste une question de sauver quelques frappes, alors ne pense pas à ce sujet. L'utilisation de MyClass.class permet à tous les outils de refactoring de reconnaître et de travailler correctement avec votre code. Lorsque vous choisissez de programmer en Java, vous taperez beaucoup. Utilisez un IDE qui vous aidera à ne pas avoir à taper autant :)

Questions connexes