1. أمر واحد يتوافق مع عملية واحدة.
عندما نبدأ برنامج Java، أي عندما نبدأ طريقة رئيسية، ستبدأ عملية آلة Java الافتراضية، بغض النظر عن مدى تعقيد العملية. لن تؤثر عمليات JVM المختلفة على بعضها البعض. ولهذا يقال أن برنامج Java له مدخل واحد فقط وهو الطريقة الرئيسية والتي يستدعيها الجهاز الظاهري. تتوافق الطريقتان الرئيسيتان مع عمليتين JVM، بدء تشغيل محملين مختلفين للفئة، وتشغيل فئات مختلفة فعليًا. ولذلك فإنها لن تؤثر على بعضها البعض.
2. تحميل الطبقة.
عندما نستخدم فئة ما، إذا لم يتم تحميل الفئة في الذاكرة، فسيقوم النظام بتهيئة الفئة من خلال التحميل والاتصال والتهيئة.
1. تحميل الفئة: يشير إلى قراءة ملف الفئة الخاص بالفئة في JVM وإنشاء كائن فئة له.
2. اتصال الفئة: يشير إلى دمج البيانات الثنائية للفئة في JRE، والذي ينقسم إلى ثلاث مراحل:
أ) التحقق: التحقق من صحة بيانات ملف الفئة المحملة.
ب). الإعداد: تخصيص مساحة تخزين للمتغيرات الثابتة للفئة وإجراء التهيئة الافتراضية.
ج). التحليل: استبدال مراجع الرموز في البيانات الثنائية للفئة بمراجع مباشرة.
3. التهيئة: تهيئة المتغيرات الثابتة وكتل التهيئة الثابتة للفئة.
(ملاحظة: بالنسبة للخاصية الثابتة من النوع النهائي، إذا تم الحصول على قيمة الخاصية في وقت الترجمة، فلن يؤدي استدعاء الخاصية إلى تهيئة الفئة، لأن هذا يعادل استخدام ثابت؛
يؤدي استخدام طريقة ClassLoader() إلى تحميل الفئة فقط وعدم تهيئتها. )
3. محمل الفئة.
محمل الفئة مسؤول عن تحميل ملفات .class في الذاكرة وإنشاء كائنات java.lang.Class المقابلة، وهو مسؤول عن تحميل جميع الفئات بمجرد تحميلها في JVM.
في Java، يتم تعريف الفئة من خلال اسم الفئة المؤهل بالكامل (أي اسم الحزمة + اسم الفئة).
في JVM، يتم تعريف الفئة من خلال اسم الفئة المؤهل بالكامل ومحمل الفئة الخاص بها.
عند تشغيل JVM، سيتم إنشاء ثلاثة ClassLoaders، وهي: BootstrapClassLoader (محمل فئة الجذر)، ExtClassLoader (محمل فئة ممتدة) وAppClassLoader (محمل فئة النظام). هيكل UML هو كما يلي:
من بينها، يعد BootstrapClassLoader مسؤولاً عن تحميل مكتبة الفئة الأساسية لـ JRE، وهي ليست فئة فرعية من ClassLoader وهي مكتوبة بلغة C++، لذلك لا يمكننا رؤيتها في Java عند الحصول عليها من خلال طريقة getParent () لفئتها الفرعية يتم إرجاعها. يعد BootstrapClassLoader مسؤولاً عن تحميل مكتبات فئة Java الأساسية مثل rt.jar وcharsets.jar ضمن هدف JRE.
كما يتبين من الشكل، ExtClassLoader وAppClassLoader هي فئات فرعية من ClassLoader. لا يمكنك رؤيتها في واجهة برمجة التطبيقات، فهي موجودة في ملف rt.jar. أسماء الفئات المؤهلة بالكامل هي:
sun.misc.Launcher$ExtClassLoader وsun.misc.Launcher$AppClassLoader.
من بينها، ExtClassLoader مسؤول عن تحميل حزمة JAR في ملحق دليل JRE ext، وAppClassLoader مسؤول عن تحميل حزمة الفئة ضمن مسار Classpath.
الاختبار هو كما يلي:
انسخ رمز الكود كما يلي:
الحزمة com.stopTalking.crazy؛
الطبقة العامة TestClassLoader {
public static void main(String[] args) {
// احصل على محمل الفصل للموضوع الحالي
محمل ClassLoader = Thread.currentThread().getContextClassLoader();
// احصل على محمل الفصل لفئة النظام
ClassLoader Loader1 = System.class.getClassLoader();
// احصل على مُحمل الفئة المُحمل 2 لهذه الفئة TestClassLoader
ClassLoader Loader2 = TestClassLoader.class.getClassLoader();
// احصل على الفئة الأصلية لـ Loader2
ClassLoader Loader3 = Loader2.getParent();
// احصل على الفئة الأصلية للفئة الأصلية لـ Loader2
ClassLoader Loader4 = Loader3.getParent();
System.out.println(loader);
System.out.println(loader1);
System.out.println(loader2);
System.out.println(loader3);
System.out.println(loader4);
}
}
إخراج وحدة التحكم:
انسخ رمز الكود كما يلي:
// مُحمل الفئة الذي تم الحصول عليه بواسطة فئة مؤشر الترابط الحالية هو AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
// يتم تحميل فئة النظام بواسطة أداة تحميل الجذر ولا يمكن الوصول إليها في جافا، لذا فهي خالية
باطل
// محمل الفصل لهذه الفئة هو بالطبع أيضًا AppClassLoader
sun.misc.Launcher$AppClassLoader@6b97fd
sun.misc.Launcher$ExtClassLoader@1c78e57
باطل