Adapun contoh kode dalam pertanyaan, solusi standar adalah merujuk kelas secara eksplisit dengan namanya, dan bahkan mungkin dilakukan tanpa getClassLoader()
panggilan:
class MyClass {
public static void startMusic() {
URL songPath = MyClass.class.getResource("background.midi");
}
}
Pendekatan ini masih memiliki sisi belakang yang tidak terlalu aman terhadap kesalahan salin / rekat jika Anda perlu mereplikasi kode ini ke sejumlah kelas serupa.
Dan untuk pertanyaan yang tepat dalam informasi utama, ada trik yang diposting di utas yang berdekatan :
Class currentClass = new Object() { }.getClass().getEnclosingClass();
Ini menggunakan anonim bersarang Object
subclass untuk mendapatkan konteks eksekusi. Trik ini bermanfaat untuk menjadi salin / tempel aman ...
Perhatian saat menggunakan ini di Kelas Dasar yang berasal dari kelas lain:
Perlu juga dicatat bahwa jika potongan ini dibentuk sebagai metode statis dari beberapa kelas dasar maka currentClass
nilai akan selalu menjadi referensi ke kelas dasar itu daripada ke subkelas yang mungkin menggunakan metode itu.
getResource()
sebelum ada turunan dari kelas yang ditentukan pengguna (misalnya non-J2SE) terkadang akan gagal. Masalahnya adalah bahwa JRE akan menggunakan bootstrap class-loader pada tahap itu, yang tidak akan memiliki sumber daya aplikasi di jalur-kelas (dari bootstrap loader).