Kelas Loader
Loader kelas Java adalah untuk secara dinamis memuat kelas yang diperlukan di JVM saat runtime. Java Class Loader didasarkan pada tiga mekanisme: delegasi, terlihat, dan lajang.
Muat file .class di bawah ClassPath ke dalam memori dan memprosesnya ke dalam bytecode. Tugas -tugas ini dilakukan oleh class loader.
Loader kelas default
Sistem default ke tiga loader kelas:
Kelas loader juga merupakan kelas Java, tetapi bootstrap tidak. Kode verifikasi:
kelas publik ClassLoaderTest {public static void main (string [] args) {System.out.println (System.class.getClassLoader ()); }}Output: NULL
If system.out.println (System.class.getClassLoader (). ToString); digunakan, pengecualian penunjuk nol dilaporkan:
Exception in thread "main" java.lang.NullPointerException at com.iot.classloader.ClassLoaderTest.main(ClassLoaderTest.java:10) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) di sun.reflect.delegatingmethodaccessorimpl.invoke (delegatingmethodaccessorimpl.java:43) di java.lang.reflect.method.invoke (Method.java:483) di com.intellij.rt.execution.application.application.application.appmmmmmm
Seperti yang dapat dilihat, kelas sistem dimuat oleh loader kelas bootstrap.
Mekanisme delegasi loader kelas
Diagram pohon class loader
Kelas Loader
Urutan Umum Kelas Pemuatan:
Cara menulis loader kelas khusus
API:
ClassLoader kelas
Pola desain metode template
Kelas Induk:
LoadClass (proses pemuatan kelas, templat)
FindClass Class Loading Logic untuk subkelas override yang dipanggil dengan metode LoadClass.
Defineclass mendapatkan file kelas dikonversi menjadi bytecode
Subkelas: Metode FindClass override
contoh:
Kode Sumber Metode LoadClass
kelas yang dilindungi <?> LoadClass (nama string, boolean resolve) melempar ClassNotFoundException {disinkronkan (getClassLoadingLock (name)) {// pertama, periksa apakah kelas sudah dimuat kelas <?> C = findloadedClass (name); if (c == null) {long t0 = system.nanoTime (); Coba {if (parent! = null) {c = parent.LoadClass (name, false); } else {c = findbootstrapclassornull (name); }} catch (ClassNotFoundException e) {// ClassNotFoundException dilemparkan jika kelas tidak ditemukan // dari class non-null class loader} if (c == null) {// Jika masih belum ditemukan, maka buka FindClass secara berurutan // untuk menemukan kelas. long t1 = system.nanoTime (); c = findClass (name); // Ini adalah loader kelas yang menentukan; Catat statistik Sun.misc.perfcounter.getParentDelegationTime (). AddTime (T1 - T0); sun.misc.perfcounter.getFindClasTime (). AddelapsedTimefrom (T1); sun.misc.perfcounter.getFindClasses (). increment (); }} if (resolve) {resolveClass (c); } return c; }}Contoh dalam dokumentasi API:
Class NetworkClassLoader memperluas classloader {string host; int port; kelas publik findClass (nama string) {byte [] b = loadClassData (name); return defineclass (name, b, 0, b.length); } byte pribadi [] LoadClassData (nama string) {// Muat data kelas dari koneksi. . . }}