سؤال

لقد رأيت العديد من الأماكن التي "class.getclassloader () إرجاع الفصل الدراسي المستخدم لتحميل هذه الفئة المعينة"، وبالتالي، فإنني أعتز بنتائج المثال التالي:


package test;

import java.lang.*;

public class ClassLoaders { 
    public static void main(String[] args) throws java.lang.ClassNotFoundException{
      MyClassLoader mcl = new MyClassLoader();
      Class clazz = mcl.loadClass("test.FooBar");
      System.out.println(clazz.getClassLoader() == mcl); // prints false
      System.out.println(clazz.getClassLoader()); // prints e.g. sun.misc.Launcher$AppClassLoader@553f5d07
    }
}

class FooBar { }

class MyClassLoader extends ClassLoader { }

لا ينبغي أن البيان clazz.getclassloader () == MCL إرجاع صحيح؟ هل يمكن للشخص أن يفسر ما أفتقده هنا؟

شكرا.

هل كانت مفيدة؟

المحلول

كلما قمت بإنشاء الفصل الدراسي الخاص بك، سيتم إرفاقه في تسلسل هرمي يشبه الشجرة من Classlowers. لتحميل فئة فئة يندش أولا التحميل إلى والدها. فقط بمجرد أن يقوم جميع الوالدين بإجراء العثور على Class The Loader الذي طلب أولا تحميل الفصل سيحاول تحميله.

في حالتك المحددة، يتم تفويض التحميل إلى Classloader الأصل. على الرغم من أنك تسألك myclassloader لتحميله، إلا أنه الوالد الذي يقوم بالتحميل. في هذه الحالة هو appclassloader.

نصائح أخرى

نقلا عن API Doc of Classloader:

يحتوي كل مثيل من Classloader على محمل فئة الوالدين المرتبط. عند الطلب للعثور على فئة أو مورد، سيقوم مثيل Classlader بتفويض البحث عن الفصل أو المورد إلى محمل الفئة الأصل قبل محاولة العثور على الفصل أو المورد نفسه.

إذا فوضو الفصل الذاتي الدعوة إلى تصنيف VM، الذي يحمل الفصل. Clazz.getClassloader () سيعود هذا الكلاس.

للوصول إلى التفاصيل: Javadoc من الفصل classlader. يوفر التفسير التالي لترتيب الخطوات المنفذة:

تحميل الفئة مع الاسم الثنائي المحدد. التنفيذ الافتراضي لطريقة البحث هذه عمليات البحث عن الفصول الدراسية بالترتيب التالي:

  1. استدعاء FindLoadEdClass (سلسلة) للتحقق مما إذا تم بالفعل تحميل الفصل بالفعل.
  2. استدعاء طريقة LoadClass على محمل الفئة الأصل. إذا كان الوالد فارغا يتم استخدام محمل الفئة المدمج إلى الجهاز الظاهري، بدلا من ذلك.
  3. استدعاء طريقة FindClass (سلسلة) للعثور على الفصل.

كما تورث دون تغيير الطرق، لن يتم تغيير هذا السلوك. الخطوة 2 سيكون هو واحد، حيث سيتم تحميل الفئة. أثناء استدعاء منشئ المعلمات من Classlader (تلقائيا، كما لم تعرف منشئ في myclassloader)، يمكنك الاستفادة من النموذج المدمج تلقائيا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top