Comment appeler getClass() à partir d'une méthode statique 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 faire l'appel suivant:
public static void startMusic() {
URL songPath = getClass().getClassLoader().getResource("background.midi");
}
Cependant Eclipse me dit:
Cannot make a static reference to the non-static method getClass()
from the type Object
Ce qui est le meilleur moyen de corriger cette erreur de compilation?
- À l'aide de
getResource()
avant qu'il y est une instance d'un définis par l'utilisateur (par exemple, la non-J2SE) classe parfois échouer. Le problème est que le JRE, à l'aide de la classe de bootstrap-chargeur à ce stade, qui n'auront pas les ressources d'application sur le chemin de classe (du chargeur de démarrage).
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser
TheClassName.class
au lieu degetClass()
.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 le faire sans
getClassLoader()
appel: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 adjacent fil:
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...De prudence lors de l'utilisation de ce dans une Classe de Base que les autres classes héritent de:
Il est également intéressant de noter que si cet extrait est en forme comme une méthode statique d'une classe de base quelconque, puis
currentClass
valeur sera toujours une référence à cette classe de base plutôt qu'à un sous-groupe qui peut être à l'aide de cette méthode.Class.getResource()
peut se comporter de façon un peu différente deClassLoader.getResource()
; voir stackoverflow.com/a/676273Dans Java7+ vous pouvez le faire dans les méthodes statiques et les champs:
private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
J'ai lutté avec moi-même. Une belle astuce consiste à utiliser le thread en cours pour obtenir un chargeur de classe dans un contexte statique. Cela permettra de travailler dans un Hadoop MapReduce ainsi. D'autres méthodes de travail lors de l'exécution au niveau local, mais renvoie null InputStream lorsqu'utilisé dans une MapReduce.
Il suffit d'utiliser une classe littéral, c'est à dire
NameOfClass.class
getClass()
méthode est définie dans la classe Object avec la signature suivante:Car il n'est pas défini comme
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:
Ce type d'expression est appelée Classe Littéraux et elles sont expliquées dans la Java Langage De Spécification De Livre comme suit:
Vous pouvez également trouver des informations sur ce sujet sur La documentation de l'API pour la Classe.
Essayer
Ou
Essayer quelque chose comme cela. Il fonctionne pour moi. Logg (nom de la Classe)