411 votes

Comment appeler getClass() d’une méthode static en Java ?

J’ai une classe qui doit avoir des méthodes statiques. À l’intérieur de ces méthodes statiques, j’ai besoin d’appeler la méthode getClass() pour effectuer l’appel suivant :

Cependant Eclipse me dit :

Quelle est la meilleure façon de remédier à cette erreur de temps de compilation ?

700voto

Mark Peters Points 42201

Il suffit d’utiliser au lieu de .

133voto

s-n-ushakov Points 523

Comme pour l'exemple de code dans la question, la solution standard est à la référence de la classe explicitement par son nom, et il est même possible de faire sans, getClassLoader() appel:

class MyClass {
  public static void startMusic() {
    URL songPath = MyClass.class.getResource("background.midi");
  }
}

Cette approche a encore de l'arrière qu'il n'est pas très sécuritaire à l'encontre de copier/coller les erreurs dans le cas où vous avez besoin de reproduire ce code à un certain nombre de classes comparables.

Et comme pour la question exacte dans le titre, il y a un truc posté dans le fil adjacent:

Class currentClass = new Object() { }.getClass().getEnclosingClass();

Il utilise un imbriquée anonyme Object sous-classe, à s'emparer du contexte d'exécution. Ce truc a un avantage de copier/coller sûr...

26voto

starkadder Points 1

J’ai lutté avec cela moi-même. Une astuce consiste à utiliser le thread en cours pour obtenir un chargeur de classe quand il est dans un contexte statique. Cela fonctionnera dans un Hadoop MapReduce ainsi. Autres méthodes fonctionnent lorsque vous exécutez localement, mais retournent un InputStream null lorsqu’il est utilisé dans un MapReduce.

16voto

Michael Borgwardt Points 181658

Il suffit d’utiliser une classe littérale, c'est-à-dire``

12voto

melihcelik Points 2411

getClass() méthode est définie dans la classe Object avec la signature suivante:

public final Class getClass()

Car il n'est pas défini en tant que static, vous ne pouvez pas appeler à l'intérieur d'une statique bloc de code. Voir la réponse à ces questions pour plus d'informations: T1, T2, T3.

Si vous êtes dans un contexte statique, alors vous devez utiliser la classe expression littérale pour obtenir la Classe, donc en gros, vous avez à faire comme:

Foo.class

Ce type d'expression est appelée Classe des Littéraux et ils sont expliqués en Langage Java Spécification de Livre comme suit:

Une classe littérale est une expression comprenant le nom d'une classe, une interface, une matrice, ou de type primitif suivi par un `.' et le jeton de classe. Le type d'une classe littérale est la Classe. Il correspond à la Classe de l'objet pour le type nommé (ou du vide), tel que défini par la définition du chargeur de classe de la classe de l'instance en cours.

Vous pouvez également trouver des informations sur ce sujet dans la documentation de l'API pour la Classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X