Sorudaki kod örneğine gelince, standart çözüm sınıfa açıkça adıyla başvurmaktır ve getClassLoader()
çağrı yapmadan da yapmak mümkündür :
class MyClass {
public static void startMusic() {
URL songPath = MyClass.class.getResource("background.midi");
}
}
Bu yaklaşımın, yine de bu kodu benzer sınıflara çoğaltmanız gerektiğinde kopyala / yapıştır hatalarına karşı çok güvenli olmadığı bir arka tarafı vardır.
Başlıktaki kesin soruya gelince, bitişik evrede bir numara var :
Class currentClass = new Object() { }.getClass().getEnclosingClass();
Object
Yürütme bağlamını elde etmek için iç içe anonim bir alt sınıf kullanır . Bu hile, kopyala / yapıştır güvenli olma avantajına sahiptir ...
Bunu diğer sınıfların miras aldığı Temel Sınıfta kullanırken dikkat edin:
Bu pasajın bazı temel sınıfların statik bir yöntemi olarak şekillendirilmesi durumunda, currentClass
değerin, bu yöntemi kullanan herhangi bir alt sınıfa değil, her zaman bu temel sınıfa referans olacağını belirtmek gerekir.
getResource()
Önceden kullanıldığında , kullanıcı tanımlı (örn. J2SE olmayan) bir sınıf örneği bazen başarısız olur. Sorun, JRE'nin sınıf yolunda (bootstrap yükleyicisinin) uygulama kaynaklarına sahip olmayacak şekilde bootstrap sınıf yükleyicisini kullanmasıdır.