إذا كنت ترغب في استخدام محمل فئة مخصصة لتحميل ملف الفئة ، فأنت بحاجة إلى ورث فئة java.lang.classloader.
هناك العديد من الطرق المهمة لـ ClassLoader:
ProtectClassloader (ClassLoaderParent): ينشئ محمل فئة جديد باستخدام محمل فئة Parent المحدد لعمليات المفوض.
ProtectedFinalClass <؟> defedeclass (StringName ، Byte [] B ، intoff ، Intlen): تحويل مجموعة من البايتات إلى مثيل للفئة.
ProtectedClass <؟> FindClass (StringName): ابحث عن الفصل مع الاسم الثنائي المحدد.
PublicClass <؟> loadClass (StringName): قم بتحميل الفصل مع الاسم الثنائي المحدد.
protectfinalClass <؟> findloadedClass (stringName): إذا كان جهاز Java Virtual قد سجل هذا المحمل كحمل بدء تشغيل لفئة ذات اسم ثنائي معين ، فسيتم إرجاع الفصل مع هذا الاسم الثنائي. خلاف ذلك ، عودة لاغية.
PublicFinalClassLoadergetParent (): إرجاع لوك الفئة الأصل المفوض.
ProtectedFinalVoidResolveClass (الفئة <؟> C): رابط للفئة المحددة.
إذا كنت ترغب في اتباع نموذج الوفد الأصل ، فعليك إعادة كتابة طريقة FindClass (StringName) ؛ إذا كنت لا ترغب في اتباع نموذج الوفد الأصل ، فعليك إعادة كتابة طريقة LoadClass (StringName) مباشرة.
تخصيص لوادر الفئة التي تتبع نموذج تفويض الوالدين
ParentDelegateClassloader.java
package com.zzj.classloader ؛ import java.io.bytearrayoutputstream ؛ import java.io PARANERDELEGATECLASSLOADER يمتد classloader {private static final string ext = ".class" ؛ private string path ؛ publicdelegateClassloader () {path = this.getResource (""). getPath () classnotfoundException {byte [] b = null ؛ try {b = loadclassfile (name) ؛} catch (ioException e) {e.printstacktrace () ؛} إرجاع هذا. getClassfile (name) ؛ system.out.println ("سيتم تحميل ملف الفصل قريبًا" + classFile) ؛ bytearrayoutputStream Out = new ByTearRayoutputStream () {out.write (temp ، 0 ، count) ؛ out.close () ؛ input.close () ؛ return out.tobytearray () ؛} سلسلة خاصة getClassfile (اسم السلسلة) {String pathName = name.replace (". ext ؛} إرجاع مسار + file.separator + pathname + ext ؛}}يوجد الآن ملف فئة com/zzj/classloader/user.class ضمن classpath classpath و f: // classloadertest // bin directory. اسم الحزمة هو com.zzj.classloader. استخدم Class Loader ParentDeleGateClassloader لتحميل الفصل تحت F: // classloadertest // bin.
package com.zzj.classloader ؛ تطبيق الفئة العامة {private static final string path = "f: // classloadertest // bin" ؛ private static final string className = "com.zzj.classloader.user" ؛ public static void main (string [] classloader.loadClass (className) ؛ system.out.println (clazz) ؛ system.out.println (clazz.getClassloader ()) ؛}}الإخراج:
class com.zzj.classloader.user sun.misc.launcher$ appclasslass@19821f
محمل فئة المستخدم هو برنامج Loader AppClassloader ، وليس محمل الفئة الذي نحدده أنفسنا. في الواقع ، ليس الفئة تحت f: // classloadertest // bin ، ولكن الفئة تحت classpath. هذا هو نموذج الوفد الأصل: عندما يتلقى ParentDeleGateClassLoader Loader طلب التحميل ، فسيتم تفويضه أولاً إلى Loader الفئة الأصل. إذا تم تحميل تحميل الفئة الأصل بنجاح ، فسيتم إرجاع كائن فئة. في حالة فشل التحميل ، سيتم تحميل محمل الفئة الذي تلقى طلب التحميل.
حذف فئة المستخدم ضمن classpath لاختبار التشغيل:
سيتم تحميل ملف الفصل قريبًا f: /classloadertest/bin/com/zzj/classloader/user.class class com.zzj.classloader.user com.zzj.classloader.parentsdelegateClassload@61de333
في هذا الوقت ، يتم تحميل فئة المستخدم كـ ParentDeleGateClassloader.
يمكن التحقق من ذلك من رمز المصدر لـ ClassLoader:
الفئة العامة <؟> loadClass (اسم السلسلة) يلقي classnotfoundException {return loadClass (name ، false) ؛ }تم استدعاء الطريقة التي تم تحميلها الزائد:
فئة متزامنة محمية <؟> loadclass (اسم السلسلة ، حل منطقي) يلقي classnotfoundException {// أولاً حدد ما إذا كان قد تم تحميل الفئة بواسطة فئة تحميل الفئة الحالية C = findloadedClass (name) ؛ if (c == null) {try {if (parent! = null) {// إذا كان محمل الفئة الأصل موجودًا ، ففوض الفئة الأصل لتحميل c = parent.loadClass (الاسم ، false) ؛ } آخر {// إذا كانت الفئة الأصل تعمل فارغة ، فإن Loader الفئة الأصل هو محمل فئة التمهيد C = FindBootSstrapClass0 (name) ؛ }} catch (classnotfoundException e) {// إذا فشل تحميل الفئة الأصل في التحميل ، فسيتم تحميله بنفسه ويتصل بالطريقة FindClass! c = findClass (name) ؛ }} if (حل) {solveClass (c) ؛ } return c ؛ }يمكن ملاحظة أنه إذا كنت تريد تدمير نموذج الوفد الأصل ، فيمكنك إعادة كتابة طريقة LoadClass (StringName) مباشرة.
تخصيص لوادر الفئة التي لا تتبع نموذج تفويض الوالدين
notparentsdelegateClassloader.java
package com.zzj.classloader ؛ import java.io.bytearrayoutputstream ؛ import java.io Author Administrator * */public class notparentsdlegateClassloader يمتد classloader {private static final string ext = ".class" ؛ private string path ؛ public notparentsdelegateClassloader () {path = this.getResource (""). class <؟> loadClass (اسم السلسلة) يلقي classnotfoundException {byte [] b = null ؛ try {b = loadclassfile (name) ؛} catch (fileNotfoundException e) إرجاع Loader الفئة الأصل getClass (). getClassloader (). loadclass (name) ؛} catch (ioException e) {system.err.println ("loader" + this.getClass (). getClass (). {system.out.println ("class" + name + "لم يتم تحميله بعد!") ؛} إرجاع هذا. classfile) ؛ bytearrayoutputStream Out = new ByTearRayOutputStream () out.tobytearray () ؛} سلسلة خاصة getClassFile (اسم السلسلة) {String pathName = name.replace ("." ، file.separator) ؛ if (path.endswith ("/") || path.endswith ("//")) {return pathname + ext ؛}الآن يوجد ملف فئة com/zzj/classloader/user.class ضمن classpath classpath ، مع اسم الحزمة com.zzj.classloader ، وفئة المستخدم هي loader notparentsdelegateclassloader.
package com.zzj.classloader ؛ public class app2 {private static final string className = "com.zzj.classloader.user" ؛ public static void main (string] classloader.loadClass (className) ؛ system.out.println (clazz) ؛ system.out.println (clazz.getClassloader ()) ؛}}الإخراج:
ملف الفئة/pile:/myeclipse/zzjtest/webroot/web-inf/classes/com/zzj/classloader/user.class class com.zzj.classloader.user لم يتم تحميله بعد! سيتم تحميل ملف الفصل قريبًا/e: /myeclipse/zzjtest/webroot/web-inf/classes/java/lang/object.class classj.zzj.classloader.user com.zzj.classlasloader.notparentsdelegateClassloader لم يتم العثور على ملف java.lang.object ، وسيتم تفويضه إلى محمل الفئة الأصل!
في هذا الوقت ، يكون محمل فئة المستخدم هو notparentsdelegateClassloader ، والذي لم يتم تفويضه إلى فئة الأصل أولاً. سيتم تفويضه فقط إلى محمل الفئة الأصل إذا فشل الحمل. يحدث هذا ليكون عكس نموذج الوفد الأصل.
بالطبع ، حتى إذا فشل الحمل ، فيمكن تحديده دون تفويض إلى محمل الفئة الأصل ، بحيث يمكن بناء آلية تحميل الفئة لنماذج الشبكات الأكثر تعقيدًا.
لخص
ما ورد أعلاه هو كل شيء عن مثال رمز لوادر فئة Java Custom ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!