Comment appeler getClass () depuis une méthode statique en Java?

J’ai une classe qui doit avoir des méthodes statiques. Dans ces méthodes statiques, je dois appeler la méthode getClass () pour effectuer 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 

Quelle est la manière appropriée de corriger cette erreur de compilation?

Utilisez simplement TheClassName.class au lieu de getClass() .

En ce qui concerne l’exemple de code dans la question, la solution standard est de référencer explicitement la classe par son nom, et il est même possible de faire sans l’appel getClassLoader() :

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

Cette approche a toujours un côté arrière qui n’est pas très sûr contre les erreurs de copier / coller si vous devez répliquer ce code dans un certain nombre de classes similaires.

Et quant à la question exacte dans le titre, il y a un truc affiché dans le fil adjacent :

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

Il utilise une sous-classe d’ Object anonyme nestede pour obtenir le contexte d’exécution. Ce truc a l’avantage d’être sûr de copier / coller …

Attention lorsque vous l’utilisez dans une classe de base dont d’autres classes héritent:

Il convient également de noter que si cet extrait de code a la forme d’une méthode statique d’une classe de base, alors la valeur de currentClass sera toujours une référence à cette classe de base plutôt qu’à une sous-classe utilisant cette méthode.

Dans Java7 +, vous pouvez le faire dans des méthodes / champs statiques:

 MethodHandles.lookup().lookupClass() 

J’ai lutté avec ça moi-même. Une bonne astuce consiste à utiliser le thread actuel pour obtenir un ClassLoader dans un contexte statique. Cela fonctionnera également dans un Hadoop MapReduce. D’autres méthodes fonctionnent lors de l’exécution locale, mais renvoient un object InputStream nul lorsqu’il est utilisé dans un MapReduce.

 public static InputStream getResource(Ssortingng resource) throws Exception { ClassLoader cl = Thread.currentThread().getContextClassLoader(); InputStream is = cl.getResourceAsStream(resource); return is; } 

Utilisez simplement un littéral de classe, à savoir NameOfClass.class

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

final publique classe getClass ()

Comme il n’est pas défini comme static , vous ne pouvez pas l’appeler dans un bloc de code statique. Voir ces réponses pour plus d’informations: Q1 , Q2 , Q3 .

Si vous êtes dans un contexte statique, vous devez utiliser l’expression littérale de classe pour obtenir la classe, vous devez donc essentiellement faire comme:

Foo.class

Ce type d’expression s’appelle Class Literals et ils sont expliqués dans Java Language Specification Book comme suit:

Un littéral de classe est une expression constituée du nom d’une classe, d’une interface, d’un tableau ou d’un type primitif suivi d’un `. ‘ et la classe de jeton. Le type d’un littéral de classe est Class. Il évalue l’object Class pour le type nommé (ou pour le vide) tel que défini par le chargeur de classe de définition de la classe de l’instance actuelle.

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

L’essayer

 Thread.currentThread().getStackTrace()[1].getClassName() 

Ou

 Thread.currentThread().getStackTrace()[2].getClassName() 

Essayez quelque chose comme ça. Ça marche pour moi. Logg (Nom de la classe)

  Ssortingng level= ""; Properties prop = new Properties(); InputStream in = Logg.class.getResourceAsStream("resources\\config"); if (in != null) { prop.load(in); } else { throw new FileNotFoundException("property file '" + in + "' not found in the classpath"); } level = prop.getProperty("Level");