Apakah ada yang tahu bagaimana cara pemrograman menemukan di mana java classloader sebenarnya memuat kelas dari?
Saya sering mengerjakan proyek besar di mana classpath menjadi sangat panjang dan pencarian manual bukan pilihan. Saya baru-baru ini memiliki masalah di mana classloader memuat versi kelas yang tidak benar karena ada di classpath di dua tempat yang berbeda.
Jadi bagaimana saya bisa mendapatkan classloader untuk memberi tahu saya di mana pada disk file kelas yang sebenarnya berasal?
Sunting: Bagaimana jika classloader benar-benar gagal memuat kelas karena ketidakcocokan versi (atau sesuatu yang lain), adakah di sana kita bisa mengetahui file apa yang coba dibaca sebelum membacanya?
java
classpath
classloader
Lukas
sumber
sumber
Jawaban:
Ini sebuah contoh:
Ini dicetak:
sumber
Test.class.getResource("Test.class")
yang tidak mengulangi nama paket.Test.class.getResource(Test.class.getSimpleName() + ".class")
BouncyCastleProvider
nama paket lengkap diperlukan.getClassLoader()
kembalinull
. Lihat di sini untuk ekstensi ke metode ini untuk mengatasinya.Cara lain untuk mengetahui dari mana kelas diambil (tanpa memanipulasi sumber) adalah memulai Java VM dengan opsi:
-verbose:class
sumber
sumber
Inilah yang kami gunakan:
Ini akan bekerja tergantung pada implementasi ClassLoader:
getClass().getProtectionDomain().getCodeSource().getLocation()
sumber
Versi Jon gagal ketika objek
ClassLoader
terdaftar sebagainull
yang tampaknya menyiratkan bahwa itu dimuat oleh BootClassLoader
.Metode ini berkaitan dengan masalah itu:
sumber
Sunting hanya baris pertama:
Main
.classKeluaran:
Mungkin gaya yang buruk tetapi bekerja dengan baik!
sumber
Biasanya, kami tidak menggunakan hardcoding. Kita bisa mendapatkan className terlebih dahulu, dan kemudian menggunakan ClassLoader untuk mendapatkan URL kelas.
sumber
Lihatlah pertanyaan serupa ini. Alat untuk menemukan kelas yang sama ..
Saya pikir kendala yang paling relevan adalah jika Anda memiliki classloader khusus (memuat dari db atau ldap)
sumber
Cara sederhana:
Contoh Keluar:
Atau
Contoh Keluar:
sumber
Pendekatan ini berfungsi untuk file dan guci:
sumber
Dengan asumsi bahwa Anda bekerja dengan kelas bernama
MyClass
, berikut ini harus berfungsi:Apakah Anda bisa mendapatkan lokasi di-disk dari file .class tergantung pada classloader itu sendiri. Misalnya, jika Anda menggunakan sesuatu seperti BCEL, kelas tertentu bahkan mungkin tidak memiliki representasi di-disk.
sumber