1. Satu perintah berhubungan dengan satu proses.
Saat kita memulai program Java, yaitu saat kita memulai metode utama, proses mesin virtual Java akan dimulai, tidak peduli seberapa rumit prosesnya. Proses JVM yang berbeda tidak akan mempengaruhi satu sama lain. Inilah sebabnya mengapa dikatakan bahwa program Java hanya mempunyai satu pintu masuk yaitu metode utama, yang dipanggil oleh mesin virtual. Dua metode utama berhubungan dengan dua proses JVM, memulai dua pemuat kelas yang berbeda, dan sebenarnya mengoperasikan kelas yang berbeda. Oleh karena itu mereka tidak akan saling mempengaruhi.
2. Pemuatan kelas.
Saat kita menggunakan suatu kelas, jika kelas tersebut belum dimuat ke dalam memori, sistem akan menginisialisasi kelas tersebut melalui pemuatan, koneksi, dan inisialisasi.
1. Pemuatan kelas: mengacu pada membaca file kelas dari kelas tersebut ke dalam JVM dan membuat objek Kelas untuknya.
2. Koneksi kelas: mengacu pada penggabungan data biner kelas ke dalam JRE, yang dibagi menjadi tiga tahap:
a) Verifikasi: Periksa kebenaran data file Kelas yang dimuat.
b). Persiapan: Alokasikan ruang penyimpanan ke variabel statis kelas dan lakukan inisialisasi default.
c). Parsing: Mengganti referensi simbol dalam data biner kelas dengan referensi langsung.
3. Inisialisasi: Inisialisasi variabel statis dan blok inisialisasi statis kelas.
(Catatan: Untuk properti statis tipe akhir, jika nilai properti telah diperoleh pada waktu kompilasi, pemanggilan properti tidak akan menyebabkan kelas diinisialisasi, karena ini setara dengan menggunakan konstanta;
Menggunakan metode ClassLoader() hanya memuat kelas dan tidak menginisialisasinya. )
3. Pemuat kelas.
Pemuat kelas bertanggung jawab untuk memuat file .class ke dalam memori dan menghasilkan objek java.lang.Class yang sesuai. Ia bertanggung jawab untuk memuat semua kelas. Setelah kelas dimuat ke dalam JVM, kelas tersebut tidak akan dimuat lagi.
Di Java, sebuah kelas diidentifikasi berdasarkan nama kelasnya yang memenuhi syarat (yaitu, nama paket + nama kelas).
Di JVM, sebuah kelas diidentifikasi berdasarkan nama kelas yang sepenuhnya memenuhi syarat dan pemuat kelasnya.
Saat JVM berjalan, akan dihasilkan tiga ClassLoader, yaitu: BootstrapClassLoader (root class loader), ExtClassLoader (extended class loader) dan AppClassLoader (system class loader). Struktur UML adalah sebagai berikut:
Diantaranya, BootstrapClassLoader bertanggung jawab untuk memuat perpustakaan kelas inti JRE. Ini bukan subkelas dari ClassLoader dan ditulis dalam C++, jadi kita tidak bisa melihatnya di Java. Ketika diperoleh melalui metode getParent() dari subkelasnya, null akan dikembalikan. BootstrapClassLoader bertanggung jawab untuk memuat perpustakaan kelas inti Java seperti rt.jar dan charsets.jar di bawah target JRE.
Seperti terlihat dari gambar, ExtClassLoader dan AppClassLoader adalah subkelas dari ClassLoader. Anda tidak dapat melihatnya di API, mereka ada di file rt.jar. Nama kelas yang sepenuhnya memenuhi syarat adalah:
sun.misc.Launcher$ExtClassLoader dan sun.misc.Launcher$AppClassLoader.
Diantaranya, ExtClassLoader bertanggung jawab untuk memuat paket JAR di direktori ekstensi JRE ext, dan AppClassLoader bertanggung jawab untuk memuat paket kelas di bawah jalur Classpath.
Tesnya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
paket com.stopTalking.crazy;
kelas publik TestClassLoader {
public static void main(String[] args) {
//Dapatkan pemuat kelas dari thread saat ini
Pemuat ClassLoader = Thread.currentThread().getContextClassLoader();
//Dapatkan pemuat kelas dari kelas Sistem
ClassLoader loader1 = Sistem.kelas.getClassLoader();
//Dapatkan pemuat kelas loader2 dari kelas TestClassLoader ini
ClassLoader loader2 = TestClassLoader.class.getClassLoader();
//Dapatkan kelas induk dari loader2
ClassLoader loader3 = loader2.getParent();
//Dapatkan kelas induk dari kelas induk loader2
ClassLoader loader4 = loader3.getParent();
System.out.println(pemuat);
Sistem.keluar.println(loader1);
Sistem.keluar.println(loader2);
Sistem.keluar.println(loader3);
Sistem.keluar.println(loader4);
}
}
Keluaran konsol:
Copy kode kodenya sebagai berikut:
//Pemuat kelas yang diperoleh oleh kelas thread saat ini adalah AppClassLoader
matahari.misc.Launcher$AppClassLoader@6b97fd
//Kelas Sistem dimuat oleh root loader dan tidak dapat diakses di java, sehingga bernilai null
batal
//Pemuat kelas dari kelas ini tentu saja juga AppClassLoader
matahari.misc.Launcher$AppClassLoader@6b97fd
matahari.misc.Launcher$ExtClassLoader@1c78e57
batal