Diambil dari tutorial yang bagus dari Sun:
Motivasi
Aplikasi yang ditulis dalam bahasa pemrograman yang dikompilasi secara statis, seperti C dan C ++, dikompilasi menjadi asli, instruksi khusus mesin dan disimpan sebagai file yang dapat dieksekusi. Proses menggabungkan kode ke dalam kode asli yang dapat dieksekusi disebut tautan - penggabungan kode yang dikompilasi secara terpisah dengan kode pustaka bersama untuk membuat aplikasi yang dapat dieksekusi. Ini berbeda dalam bahasa pemrograman yang dikompilasi secara dinamis seperti Java. Di Jawa, file .class yang dihasilkan oleh kompiler Java tetap apa adanya hingga dimuat ke Java Virtual Machine (JVM) - dengan kata lain, proses penautan dilakukan oleh JVM saat runtime. Kelas dimuat ke JVM berdasarkan 'sesuai kebutuhan'. Dan ketika kelas dimuat tergantung pada kelas lain, maka kelas itu dimuat juga.
Ketika aplikasi Java diluncurkan, kelas pertama yang dijalankan (atau titik masuk ke dalam aplikasi) adalah kelas dengan metode public static void yang disebut main (). Kelas ini biasanya memiliki referensi ke kelas lain, dan semua upaya untuk memuat kelas yang dirujuk dilakukan oleh pemuat kelas.
Untuk merasakan pemuatan kelas rekursif ini dan juga gagasan pemuatan kelas secara umum, pertimbangkan kelas sederhana berikut ini:
public class HelloApp {
public static void main(String argv[]) {
System.out.println("Aloha! Hello and Bye");
}
}
Jika Anda menjalankan kelas ini menentukan opsi -verbose: class-line perintah, sehingga mencetak kelas apa yang sedang dimuat, Anda akan mendapatkan output yang terlihat seperti berikut. Perhatikan bahwa ini hanya sebagian output karena daftar terlalu panjang untuk ditampilkan di sini.
prmpt>java -verbose:class HelloApp
[Opened C:\Program Files\Java\jre1.5.0\lib\rt.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jsse.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jce.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]
[Loaded java.lang.Throwable from shared objects file]
.
.
.
[Loaded java.security.BasicPermissionCollection from shared objects file]
[Loaded java.security.Principal from shared objects file]
[Loaded java.security.cert.Certificate from shared objects file]
[Loaded HelloApp from file:/C:/classes/]
Aloha! Hello and Bye
[Loaded java.lang.Shutdown from shared objects file]
[Loaded java.lang.Shutdown$Lock from shared objects file]
Seperti yang Anda lihat, kelas Java runtime yang diperlukan oleh kelas aplikasi (HelloApp) dimuat terlebih dahulu.
Loader Kelas di Platform Java 2
Bahasa pemrograman Java terus berkembang untuk membuat kehidupan para pengembang aplikasi lebih mudah setiap hari. Ini dilakukan dengan menyediakan API yang menyederhanakan hidup Anda dengan memungkinkan Anda berkonsentrasi pada logika bisnis daripada detail implementasi mekanisme fundamental. Hal ini terbukti dengan perubahan J2SE 1.5 menjadi J2SE 5.0 untuk mencerminkan kematangan platform Java.
Pada JDK 1.2, loader kelas bootstrap yang dibangun ke dalam JVM bertanggung jawab untuk memuat kelas-kelas Java runtime. Loader kelas ini hanya memuat kelas yang ditemukan di boot classpath, dan karena ini adalah kelas tepercaya, proses validasi tidak dilakukan seperti untuk kelas yang tidak terpercaya. Selain pemuat kelas bootstrap, JVM memiliki pemuat kelas ekstensi yang bertanggung jawab untuk memuat kelas dari API ekstensi standar, dan pemuat kelas sistem yang memuat kelas dari jalur kelas umum serta kelas aplikasi Anda.
Karena ada lebih dari satu pemuat kelas, mereka direpresentasikan dalam pohon yang akarnya adalah pemuat kelas bootstrap. Setiap pemuat kelas memiliki referensi ke pemuat kelas induknya. Ketika pemuat kelas diminta untuk memuat kelas, itu berkonsultasi dengan pemuat kelas induknya sebelum mencoba memuat item itu sendiri. Orang tua pada gilirannya berkonsultasi dengan orang tuanya, dan seterusnya. Jadi itu hanya setelah semua pemuat kelas leluhur tidak dapat menemukan kelas yang melibatkan pemuat kelas saat ini. Dengan kata lain, model delegasi digunakan.
Kelas java.lang.ClassLoader
Ini java.lang.ClassLoader
adalah kelas abstrak yang dapat disubklasifikasikan oleh aplikasi yang perlu memperluas cara di mana JVM memuat kelas secara dinamis. Konstruktor dalam java.lang.ClassLoader
(dan subkelasnya) memungkinkan Anda untuk menentukan induk ketika Anda membuat instance kelas loader baru. Jika Anda tidak secara eksplisit menentukan induk, pemuat kelas sistem mesin virtual akan ditetapkan sebagai induk default. Dengan kata lain, kelas ClassLoader menggunakan model delegasi untuk mencari kelas dan sumber daya. Oleh karena itu, setiap instance dari ClassLoader memiliki loader kelas induk yang terkait, sehingga ketika diminta untuk menemukan kelas atau sumber daya, tugas didelegasikan ke loader kelas induknya sebelum berusaha menemukan kelas atau sumber daya itu sendiri. The loadClass()
metode ClassLoader yang melakukan kegiatan sebagai berikut, agar, saat dipanggil untuk memuat kelas:
Jika kelas telah dimuat, itu mengembalikannya. Jika tidak, ia mendelegasikan pencarian kelas baru ke loader kelas induk. Jika pemuat kelas induk tidak menemukan kelas, loadClass()
panggil metode findClass()
untuk menemukan dan memuat kelas. The finalClass()
Metode pencarian untuk kelas di kelas loader saat ini jika kelas tidak ditemukan oleh loader kelas induk.
Ada lebih banyak di artikel asli, yang juga menunjukkan kepada Anda bagaimana menerapkan pemuat kelas jaringan Anda sendiri, yang menjawab pertanyaan Anda tentang mengapa (dan bagaimana). Lihat juga dokumentasi API .