Was das Codebeispiel in der Frage betrifft, besteht die Standardlösung darin, die Klasse explizit mit ihrem Namen zu referenzieren, und es ist sogar möglich, auf einen getClassLoader()
Aufruf zu verzichten:
class MyClass {
public static void startMusic() {
URL songPath = MyClass.class.getResource("background.midi");
}
}
Dieser Ansatz hat immer noch die Rückseite, dass er nicht sehr sicher gegen Kopier- / Einfügefehler ist, falls Sie diesen Code in eine Reihe ähnlicher Klassen replizieren müssen.
Und was die genaue Frage in der Überschrift betrifft, gibt es im nebenstehenden Thread einen Trick :
Class currentClass = new Object() { }.getClass().getEnclosingClass();
Es verwendet eine verschachtelte anonyme Object
Unterklasse, um den Ausführungskontext abzurufen. Dieser Trick hat den Vorteil, dass er kopier- und einfügesicher ist ...
Vorsicht bei der Verwendung in einer Basisklasse, von der andere Klassen erben:
Es ist auch erwähnenswert, dass, wenn dieses Snippet als statische Methode einer Basisklasse geformt ist, der currentClass
Wert immer eine Referenz auf diese Basisklasse ist und nicht auf eine Unterklasse, die diese Methode möglicherweise verwendet.
getResource()
bevor eine Instanz einer benutzerdefinierten Klasse (z. B. Nicht-J2SE) vorhanden ist, schlägt manchmal fehl. Das Problem ist, dass die JRE zu diesem Zeitpunkt den Bootstrap-Klassenlader verwendet, der keine Anwendungsressourcen im Klassenpfad (des Bootstrap-Laders) hat.