Pertanyaan getClass (). getClassLoader () adalah null, mengapa?


Saya punya beberapa kode yang memanggil ..

x = getClass().getClassLoader();

Ini mengembalikan nol sekalipun.

Ketika saya memulai kode yang sama bukan dari Eclipse, tetapi pada command line, ia mengembalikan classloader.

Saya dapat meretas kode untuk melakukan ini ...

if (getClass().getClassLoader() == null)
{
 x = ClassLoader.getSystemClassLoader().getSystemResourceAsStream( loadedPropFileName );
} 

keduanya dikompilasi dan dijalankan dengan JVM yang sama. (Saya 99,99% yakin).

Ada yang punya ide mengapa yang pertama akan mengembalikan nol untuk classloader?

Edit:

Pertanyaan saya adalah apakah "Ada yang punya ide mengapa kelas yang sama akan mengembalikan nol ketika dimulai melalui Eclipse dan loader kelas ketika dimuat dari baris perintah."

Terima kasih atas saran bahwa pemuat Bootstap harus memuat kelas di Eclipse. Saya tidak tahu mengapa ini terjadi.


32
2017-12-17 11:52


asal


Jawaban:


Mengutip Dokumen API:

Beberapa implementasi mungkin menggunakan nol untuk   mewakili loader kelas bootstrap.   Metode ini akan mengembalikan null sedemikian   implementasi jika kelas ini   dimuat oleh loader kelas bootstrap.


31
2017-12-17 11:59



Begini Cara kerjanya . Setiap kali JVM mencoba untuk memuat kelas apa pun, ceknya di bawah ketentuan.

Jika Kelas dimuat dari Bootstrap ClassPath yaitu; jdk \ jre \ lib \ rt.jar, BootStrap ClassLoader akan dipanggil.

Jika Kelas diambil dari Extension Classpath yaitu; jdk \ jre \ lib \ ext * .jar, Extension ClassLoader akan dipanggil.

Jika Kelas diambil dari Aplikasi ClassPath yaitu; sebagaimana ditentukan dalam Variabel Lingkungan, Aplikasi ClassLoader dipanggil.

Karena Bootstrap ClassLoader tidak diimplementasikan di java, itu baik diimplementasikan dalam c atau c ++ sehingga tidak ada referensi untuk itu itu mengapa ia mengembalikan null. Tapi Extension dan Application Class Loader ditulis dalam java sehingga Anda akan mendapatkan referensi sebagai sun.misc.Launcher$ExtClassLoader@someHexValue dan sun.misc.Launcher$AppClassLoader@someHexValue.

Jadi, jika kamu melakukan sesuatu seperti ini System.out.println (String.class.getClassLoader ()) Anda akan mendapatkan null karena kelas ini telah dipanggil oleh BootStrap ClassLoader, Di sisi lain jika Anda melakukan hal yang sama untuk kelas di jalur Ext atau App Class Anda akan mendapatkan $ ExtClassLoader @ someHexValue dan sun.misc.Launcher$AppClassLoader@someHexValue masing-masing.


7
2017-09-26 05:22



"Metode ini akan mengembalikan null dalam implementasi tersebut jika kelas ini dimuat oleh loader kelas bootstrap." http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Class.html#getClassLoader ()


5
2017-12-17 12:00



Satu hal yang pasti, Eclipse memiliki setup classloader yang lebih dalam dan lebih rumit daripada ketika Anda menjalankan dari baris perintah. Jika Anda melihat perbedaan dalam bagaimana classloader kelas muncul dalam satu versus yang lain maka itu adalah alasan yang sangat mungkin.

Saya tidak memiliki pengetahuan tentang apa yang sebenarnya dilakukan Eclipse tetapi saya pikir sangat mungkin bahwa kelas Anda adalah tidak sedang dimuat oleh classloader bootstrap ketika dijalankan dari Eclipse tetapi Eclipse berusaha membuatnya tampak seperti itu.

ClassLoader bootstrap bersifat statis setelah aplikasi bootstrapped dan Anda tidak dapat menambahkan guci atau kelas untuk itu nanti kecuali Eclipse telah mengesampingkan pelaksanaan ... dalam hal ini, masih ada penjelasan lain yang mungkin.


3
2017-12-18 00:49



Saya memiliki masalah yang sama. Tapi dipecahkan dengan menggunakan: -

<ClassName>.class.getClass().getResource(urlString);

Semoga ini bisa membantu orang lain ...


0
2017-10-03 16:35



"Metode ini akan mengembalikan null dalam implementasi tersebut jika kelas ini dimuat oleh loader kelas bootstrap." - JavaDoc di getClassLoader ()

Kelas null loader disediakan untuk kelas sistem untuk tujuan keamanan dan hanya dapat digunakan jika Class.forName (nama String, boolean menginisialisasi, pemuat ClassLoader). Jika kelas memiliki ClassLoader null, sebagian besar pemeriksaan keamanan tidak dilakukan.


0
2017-07-08 07:54



Punya masalah serupa. Dipecahkan dengan tidak menggunakan Metode getClass. Mengikuti bekerja untuk saya.

<ClassName>.class.getClassLoader();

0
2018-06-28 12:03