423 Stimmen

Wie ruft man getClass() aus einer statischen Methode in Java auf?

Ich habe eine Klasse, die einige statische Methoden haben muss. Innerhalb dieser statischen Methoden muss ich die Methode getClass() aufrufen, um den folgenden Aufruf zu machen:

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

Allerdings sagt mir Eclipse:

Cannot make a static reference to the non-static method getClass() 
from the type Object

Wie lässt sich dieser Kompilierzeitfehler beheben?

13voto

Ishfaq Punkte 402

Versuchen Sie es

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

Oder

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

11voto

melihcelik Punkte 4461

getClass() Methode ist in der Klasse Object mit der folgenden Signatur definiert:

public final Klasse getClass()

Da es nicht definiert ist als static können Sie ihn nicht innerhalb eines statischen Codeblocks aufrufen. In diesen Antworten finden Sie weitere Informationen: Q1 , Q2 , Q3 .

Wenn Sie sich in einem statischen Kontext befinden, müssen Sie den Klassenliteralausdruck verwenden, um die Klasse zu erhalten, also müssen Sie im Grunde genommen so vorgehen:

Foo.class

Diese Art von Ausdruck wird als Klasse Literale und sie werden erklärt in Java Language Specification Book wie folgt:

Ein Klassenliteral ist ein Ausdruck, der aus dem Namen einer Klasse, einer Schnittstelle, eines Arrays oder eines primitiven Typs, gefolgt von einem `.' und dem Token class, besteht. Der Typ eines Klassenliterales ist Class. Es wird als Class-Objekt für den benannten Typ (oder für void) ausgewertet, wie es durch den definierenden Klassenlader der Klasse der aktuellen Instanz definiert ist.

Informationen zu diesem Thema finden Sie auch unter API-Dokumentation für die Klasse.

3voto

user14203853 Punkte 31

Ich hatte das gleiche Problem! aber um es zu lösen, ändern Sie einfach Ihren Code wie folgt.

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

Das hat bei mir gut funktioniert, und ich hoffe, dass es auch bei Ihnen gut funktionieren wird.

0voto

Pravind Kumar Punkte 419

Angenommen, es gibt eine Utility-Klasse, dann wäre der Beispielcode -

    URL url = Utility.class.getClassLoader().getResource("customLocation/".concat("abc.txt"));

CustomLocation - falls eine Ordnerstruktur innerhalb der Ressourcen vorhanden ist, andernfalls entfernen Sie dieses String-Literal.

-2voto

Versuchen Sie so etwas. Das funktioniert bei mir. Logg (Klassenname)

    String 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");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X