Jika Anda ingin menggunakan loader kelas khusus untuk memuat file kelas, Anda harus mewarisi kelas java.lang.classloader.
Ada beberapa metode penting untuk ClassLoader:
ProtectedClassLoader (ClassLoaderParent): Membuat loader kelas baru menggunakan loader kelas induk yang ditentukan untuk operasi delegasi.
ProtectedFinalClass <?> Defineclass (StringName, Byte [] B, Intoff, Intlen): Konversi array byte ke instance kelas kelas.
ProtectedClass <?> FindClass (StringName): Temukan kelas dengan nama biner yang ditentukan.
PublicClass <?> LoadClass (StringName): Muat kelas dengan nama biner yang ditentukan.
ProtectedFinalClass <?> FindloadedClass (StringName): Jika mesin virtual Java telah merekam loader ini sebagai pemuat startup dari kelas dengan nama biner yang diberikan, kelas dengan nama biner itu dikembalikan. Kalau tidak, kembalikan nol.
PublicFinalClassLoaderGetParent (): Mengembalikan loader kelas induk yang didelegasikan.
ProtectedFinalVoidResolveclass (Class <?> C): Tautan ke kelas yang ditentukan.
Jika Anda ingin mengikuti model delegasi induk, maka tulis ulang metode FindClass (StringName); Jika Anda tidak ingin mengikuti model delegasi induk, maka tulis ulang metode LoadClass (StringName) secara langsung.
Kustomisasi loader kelas yang mengikuti model delegasi orang tua
ParentsDelegateClassLoader.java
Paket com.zzj.classloader; impor java.io.bytearrayoutputstream; import java.io.file; impor java.io.fileinputStream; public/** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PUTRA DELEGATE PUTRA DENGASI PUSTRACET; ParentsDelegateClassLoader memperluas classloader {private static final string ext = ".class"; private string path; PUTRA PUBLIK PUBLIKEGATECLASSLOADER () {PATH = this.getResource (""). GetPath ();} PUTRADEDEGEDEGATECLASSLASREADER (Jalur string) {this.path = Path; ClassNotFoundException {byte [] b = null; coba {b = loadClassFile (name);} catch (ioException e) {e.printstacktrace ();} return this.defineClass (name, b, 0, b.length);} private byte [] loadClassfile (name, b, 0, b.length);} private byte [] loadClassfile (name, b, 0, b.length);} private byte [] loadClassfile (string name) = b.lowscepte); getClassFile(name);System.out.println("The class file will be loaded soon" + classFile);ByteArrayOutputStream out = new ByteArrayOutputStream();InputStream input = new FileInputStream(classFile);int count;byte[] temp = new byte[1024];while ((count = input.read(temp))) > -1) {out.write (temp, 0, count);} out.close (); input.close (); return out.tobyteArray ();} string private getClassFile (name string) {string pathname = name.replace (".", file.separator); if (path.endswith ("") (") ("); + Ext;} return path + file.separator + pathname + ext;}}Sekarang ada file kelas com/zzj/classloader/user.class di bawah classpath classpath dan f: // classloaderTest // bin directory. Nama paketnya adalah com.zzj.classloader. Gunakan class loader parentsdelegateClassLoader untuk memuat kelas di bawah f: // classloaderTest // bin.
Paket com.zzj.classloader; aplikasi kelas publik {private static final string path = "f: // classloaderTest // bin"; private static final string className = "com.zzj.classloader.user"; public static Main (string [] args) lemparan {parentsdelegateClassLasserer classLoader (string [] args (classDelaser {parentsdelegateClassLasserer classLoader (string [] args (classDelserer {parentsdelegateClassLassLADLASEER MAIN ClassLoader.LoadClass (className); System.out.println (clazz); System.out.println (clazz.getClassLoader ());}}Keluaran:
kelas com.zzj.classloader.user sun.misc.launcher$appclassloader@19821f
Loader dari kelas pengguna adalah System Class Loader AppClassLoader, bukan class loader yang kami definisikan sendiri. Bahkan, ini bukan kelas di bawah f: // classloaderTest // bin, tetapi kelas di bawah classpath. Ini adalah model delegasi induk: Ketika orang tua yang menjadi loadererererererererer menerima permintaan pemuatan, itu pertama -tama akan didelegasikan ke loader kelas induk. Jika loader kelas induk berhasil dimuat, objek kelas akan dikembalikan. Jika beban gagal, loader kelas yang menerima permintaan beban akan dimuat.
Hapus kelas pengguna di bawah ClassPath untuk menguji coba:
File kelas akan segera dimuat f: /classloaderTest/bin/com/zzj/classloader/user.class class com.zzj.classloader.user com.zzj.classloader.parentsdelegateClassloader@61de33
Pada saat ini, kelas pengguna memuat sebagai orang tuaDelegateClassLoader.
Ini dapat diverifikasi dari kode sumber ClassLoader:
kelas publik <?> LoadClass (nama string) melempar ClassNotFoundException {return loadClass (name, false); }Metode yang kelebihan beban disebut:
Kelas Sinkronisasi yang Dilindungi <?> LoadClass (nama String, Boolean Resolve) Melempar ClassNotFoundException {// Pertama tentukan apakah kelas telah dimuat oleh kelas loader kelas saat ini c = findloadedClass (name); if (c == null) {coba {if (parent! = null) {// Jika ada kelas induk loader, kemudian mendelegasikan ke kelas induk untuk memuat c = parent.LoadClass (name, false); } else {// Jika kelas induk memuat kosong, loader kelas induknya adalah boot class loader c = findbootstrapclass0 (name); }} catch (classnotfoundException e) {// Jika class loader induk gagal memuat, itu akan memuat sendiri dan memanggil metode FindClass! c = findClass (name); }} if (resolve) {resolveClass (c); } return c; }Dapat dilihat bahwa jika Anda ingin menghancurkan model delegasi induk, Anda dapat langsung menulis ulang metode LoadClass (StringName).
Kustomisasi loader kelas yang tidak mengikuti model delegasi induk
NotparentsdelegateClassLoader.java
Paket com.zzj.classloader; import java.io.bytearrayoutputstream; import java.io.file; impor java.io.fileinputStream; classe loadere loader (Import non-payer (Import non-payor; Metode * * @Author Administrator * */kelas publik notparentsdelegateClassLoader memperluas classloader {private static final string ext = ".class"; Path string private; public notparentsdelegateClassLoader () {Path = this.getResource (""). getPath ();} notparentsdeleG = this.getResource ("). getPath ();} notparentsdeleG = this.getResource ("). getPath ();} notparentsdelel = this.getResource ("). path;}@override Public Class <?> LoadClass (nama string) melempar ClassNotFoundException {byte [] b = null; coba {b = loadClassFile (name);} catch (filenotfoundException e) {System.err.println ("loader" + this.getClass (). loader! "); // didelegasikan ke kelas induk loader return getClass (). getClassLoader (). LoadClass (name);} catch (ioException e) {System.err.println (" loader " + this.getClass (). GetName ()" class loading file kelas " + name +" Gagal ke classer (). GetName () "class class; getClass (). getClassLoader (). LoadClass (name);} // Periksa apakah kelas telah dimuat oleh kelas saat ini loader (hanya periksa kelas saat ini, bukan kelas induk loader) <?> clazz = findloadedclass (name); if (clazz! = null) {System.out.println ("class" class " {System.out.println("class" + name + "not loaded yet!");}return this.defineClass(name, b, 0, b.length);}private byte[] loadClassFile(String name) throws IOException, FileNotFoundException {String classFile = getClassFile(name);System.out.println("The class file will be loaded" + classFile); bytearrayoututputStream out = bytearrayoutputStream (); inputStream input = new fileInputStream (classfile); int count; byte [] temp = byte baru [1024]; while ((count = input.read (temp)))> -1) {out.write, (count = input.read (temp)))> -1) {out.write, temp, 0 hitung);} out.close (); input.close (); return out.tObyteArray ();} string private getClassFile (nama string) {string pathname = name.replace (".", file.separator); if (path.endswith ("/") || path.endswith ("//path (path.endswith ("/") || path.endswith ("//path (Path.endswith ("/) File.separator + pathname + ext;}}Sekarang ada file kelas com/zzj/classloader/user.class di bawah classpath classpath, dengan nama paket com.zzj.classloader, dan kelas pengguna adalah loader notparentsdelegateClassLoader.
Paket com.zzj.classloader; kelas publik app2 {private static final string className = "com.zzj.classloader.user"; public static void main (string [] args) melempar pengecualian {notparentsdelegateClasserer classloader = notparentsdelegateClasserer (); class <?>; ClassLoader.LoadClass (className); System.out.println (clazz); System.out.println (clazz.getClassLoader ());}}Keluaran:
File kelas //myeclipse/zzjtest/webroot/web-inf/classes/com/zzj/classloader/user.class kelas com.zzj.classloader.user belum dimuat! File kelas akan segera dimuat/e: /myeclipse/zzjtest/webroot/web-inf/classes/java/lang/object.class class com.zzj.classloader.user com.zzj.classloader.notparentsdelegateClasserer@61de33 com.erererer.notparentsdelasclassererererererererererererererererererererererererererererererer.notparentsDelegateClasser@61de33 File kelas java.lang.Object tidak ditemukan, dan akan didelegasikan ke loader kelas induk!
Pada saat ini, loader kelas pengguna adalah notparentsdelegateClassLoader, yang tidak didelegasikan ke kelas induk terlebih dahulu. Ini hanya akan didelegasikan ke loader kelas induk jika beban gagal. Ini merupakan kebalikan dari model delegasi induk.
Tentu saja, bahkan jika beban gagal, itu dapat ditentukan tanpa mendelegasikan ke loader kelas induk, sehingga mekanisme pemuatan kelas dari model mesh yang lebih kompleks dapat dibangun.
Meringkaskan
Di atas adalah semua tentang contoh kode dari Java Custom Class Loader, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!