Tidak semua dimuatkan, ia boleh difahami sebagai memuatkan atas permintaan. Contohnya, kelas induk yang diwarisi, antara muka yang dilaksanakan, pembolehubah yang diisytiharkan, jenis pemulangan kaedah, dsb.
Iaitu, apabila menggunakan kelas semasa, mana-mana kelas yang diperlukan yang tiada akan dimuatkan serta-merta.
1) Apabila menemui empat arahan kod bait baharu, getstatic, putstatic atau invokestatic, jika kelas belum dimulakan, permulaannya perlu dicetuskan terlebih dahulu. Senario kod Java yang paling biasa yang menjana empat arahan ini ialah: apabila menggunakan kata kunci baharu untuk membuat seketika objek, membaca atau menetapkan medan statik kelas (diubah suai secara akhir, dan hasilnya telah dimasukkan ke dalam kumpulan malar pada masa penyusunan ). 2) Apabila menggunakan kaedah pakej java.lang.reflect untuk membuat panggilan reflektif ke kelas, jika kelas belum dimulakan, pemulaannya perlu dicetuskan terlebih dahulu. 3) Apabila memulakan kelas, jika didapati bahawa kelas induknya belum dimulakan, anda perlu mencetuskan permulaan kelas induknya terlebih dahulu. 4) Apabila mesin maya dimulakan, pengguna perlu menentukan kelas utama untuk dilaksanakan (kelas yang mengandungi kaedah main()), dan mesin maya akan mula-mula memulakan kelas utama. 5) Apabila menggunakan sokongan bahasa dinamik JDK 1.7, jika hasil penghuraian akhir bagi contoh java.lang.invoke.MethodHandle ialah pemegang kaedah REF_getStatic, REF_putStatic, REF_invokeStatic dan kelas yang sepadan dengan pemegang kaedah ini mempunyai belum dimulakan, anda perlu mencetuskan permulaannya terlebih dahulu. Untuk lima senario yang akan mencetuskan permulaan kelas, spesifikasi mesin maya menggunakan kelayakan yang sangat kuat: "ya dan sahaja". Di samping itu, semua kaedah merujuk kelas tidak akan mencetuskan permulaan dan dipanggil rujukan pasif.
Sumber: Pemahaman mendalam tentang masa pemuatan kelas JVM 7.2
Saya belum memahami sepenuhnya bidang ini, jadi saya tidak berani untuk mengelirukan orang lain. Seperti yang saya tahu, apabila mesin maya sedang berjalan, ia akan pramuat kelas yang biasa digunakan, seperti kelas di bawah pakej java.lang. Bagi fail kelas/pakej balang yang anda rujuk dalam program anda, terdapat proses pemuatan. Apabila mesin maya memerlukan fail kelas, ia akan memanggil classLoader.loadClass() untuk memuatkannya terlebih dahulu ditemui, ia akan diserahkan kepada pemuat induk. Selepas mencari lapisan demi lapisan, classLoader akan memanggil kaedah findClass untuk memuatkan fail. Kelas yang dilindungi<?> loadClass(Nama rentetan, penyelesaian boolean)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
Tidak semua dimuatkan, ia boleh difahami sebagai memuatkan atas permintaan.
Contohnya, kelas induk yang diwarisi, antara muka yang dilaksanakan, pembolehubah yang diisytiharkan, jenis pemulangan kaedah, dsb.
Iaitu, apabila menggunakan kelas semasa, mana-mana kelas yang diperlukan yang tiada akan dimuatkan serta-merta.
Muat atas permintaan.
Masa pemuatan kelas:
1) Apabila menemui empat arahan kod bait baharu, getstatic, putstatic atau invokestatic, jika kelas belum dimulakan, permulaannya perlu dicetuskan terlebih dahulu. Senario kod Java yang paling biasa yang menjana empat arahan ini ialah: apabila menggunakan kata kunci baharu untuk membuat seketika objek, membaca atau menetapkan medan statik kelas (diubah suai secara akhir, dan hasilnya telah dimasukkan ke dalam kumpulan malar pada masa penyusunan ).
2) Apabila menggunakan kaedah pakej java.lang.reflect untuk membuat panggilan reflektif ke kelas, jika kelas belum dimulakan, pemulaannya perlu dicetuskan terlebih dahulu.
3) Apabila memulakan kelas, jika didapati bahawa kelas induknya belum dimulakan, anda perlu mencetuskan permulaan kelas induknya terlebih dahulu.
4) Apabila mesin maya dimulakan, pengguna perlu menentukan kelas utama untuk dilaksanakan (kelas yang mengandungi kaedah main()), dan mesin maya akan mula-mula memulakan kelas utama.
5) Apabila menggunakan sokongan bahasa dinamik JDK 1.7, jika hasil penghuraian akhir bagi contoh java.lang.invoke.MethodHandle ialah pemegang kaedah REF_getStatic, REF_putStatic, REF_invokeStatic dan kelas yang sepadan dengan pemegang kaedah ini mempunyai belum dimulakan, anda perlu mencetuskan permulaannya terlebih dahulu.
Untuk lima senario yang akan mencetuskan permulaan kelas, spesifikasi mesin maya menggunakan kelayakan yang sangat kuat: "ya dan sahaja". Di samping itu, semua kaedah merujuk kelas tidak akan mencetuskan permulaan dan dipanggil rujukan pasif.
Sumber: Pemahaman mendalam tentang masa pemuatan kelas JVM 7.2
Saya belum memahami sepenuhnya bidang ini, jadi saya tidak berani untuk mengelirukan orang lain.
Seperti yang saya tahu, apabila mesin maya sedang berjalan, ia akan pramuat kelas yang biasa digunakan, seperti kelas di bawah pakej java.lang.
Bagi fail kelas/pakej balang yang anda rujuk dalam program anda, terdapat proses pemuatan.
Apabila mesin maya memerlukan fail kelas, ia akan memanggil classLoader.loadClass() untuk memuatkannya terlebih dahulu ditemui, ia akan diserahkan kepada pemuat induk. Selepas mencari lapisan demi lapisan, classLoader akan memanggil kaedah findClass untuk memuatkan fail.
Kelas yang dilindungi<?> loadClass(Nama rentetan, penyelesaian boolean)
http://blog.csdn.net/briblue/...
Anda boleh rujuk blog ini, ia sangat bagus