تحميل فئة
يتمثل محمل فئة Java في تحميل الفئات المطلوبة ديناميكيًا في JVM في وقت التشغيل. يعتمد محمل فئة Java على ثلاث آليات: مندوب ، مرئي ، ومنفرد.
قم بتحميل ملفات .class تحت ClassPath في الذاكرة ومعالجةها في رمز bytecode. يتم تنفيذ هذه المهام بواسطة اللودر الفئة.
تحميل الفئة الافتراضية
يتخلف النظام عن ثلاثة لوادر فئة:
محمل الفصل هو أيضًا فئة Java ، لكن Bootstrap ليس كذلك. رمز التحقق:
الفئة العامة classLoaderTest {public static void main (string [] args) {system.out.println (system.class.getClassLoader ()) ؛ }}الإخراج: لاغ
if system.out.println (system.class.getClassLoader (). toString) ؛ يستخدم ، تم الإبلاغ عن استثناء مؤشر فارغ:
استثناء في موضوع "Main" java.lang.nullpointerxception في com.iot.classloader.classloadertest.main (classloadertest.java:10) في sun.reflect.nativemethodaccoriMpl.invoke0 (native) at sun.reflect.nativemetactorimpl.invoke Sun.Reflect.DelegatingMethodAccessorImpl.invoke (DevatingMethodAccessorImpl.Java:43) في java.lang.reflect.method.invoke (method.java:483) في com.intellij.rt.execution.application.appmain.main
كما يتضح ، يتم تحميل فئة النظام بواسطة محمل فئة bootstrap.
آلية مندوب اللودر الفئة
مخطط شجرة اللودر
تحميل فئة
الترتيب العام لفئات التحميل:
كيفية كتابة محمل فئة مخصصة
API:
فئة الفصل الدراسي
نمط تصميم طريقة القالب
فئة الوالدين:
LoadClass (عملية تحميل الفئة ، قالب)
FindClass فئة التحميل منطق لتجاوزات الفئة الفرعية التي تسمى طريقة LoadClass.
DefereClass GET CLASS يتم تحويل ملف الفئة إلى BYTECODE
الفئة الفرعية: Override FindClass Method
مثال:
رمز المصدر لطريقة loadclass
فئة محمية <؟> loadclass (اسم السلسلة ، حل منطقي) يلقي classnotfoundException {synchronized (getClassLoadingLock (name)) {// أولاً ، تحقق مما إذا كان قد تم بالفعل تحميل الفئة <؟> c = findloadedclass (name) ؛ if (c == null) {long t0 = system.nanotime () ؛ حاول {if (parent! = null) {c = parent.loadClass (name ، false) ؛ } else {c = findBootStrapClassornull (name) ؛ }} catch (classnotfoundException e) {// classnotfoundException تم إلقاؤه إذا لم يتم العثور على فئة // من loader من فئة الوالدين غير null} if (c == null) {// إذا لم يتم العثور عليها ، فاستدعاء FindClass بالترتيب // للعثور على الفئة. طويل T1 = system.nanotime () ؛ c = findClass (name) ؛ // هذا هو محمل فئة محدد ؛ سجل الإحصائيات sun.misc.perfcounter.getParentDelegationTime (). addTime (T1 - T0) ؛ sun.misc.perfcounter.getFindClasStime (). addelapsedTimeFrom (T1) ؛ sun.misc.perfcounter.getFindClasses (). studrement () ؛ }} if (حل) {solveClass (c) ؛ } return c ؛ }}أمثلة في وثائق API:
Class NetworkClassLoader يمتد ClassLoader {String Host ؛ ميناء الفئة العامة FindClass (اسم السلسلة) {byte [] b = loadClassData (name) ؛ إرجاع defedeclass (الاسم ، B ، 0 ، B.Length) ؛ } byte byte [] loadClassData (اسم السلسلة) {// قم بتحميل بيانات الفئة من الاتصال. . . }}