- يقوم مُحمِّل الفئات بالعثور على ملف فئة وتحميله إلى JVM حتى يتمكن البرنامج من استخدامه.
- يتم تحميل الفئات عند الحاجة إليها لأول مرة، وليس عند بدء التشغيل، ويحدد المُحمِّل التعليمات البرمجية البايتية في كل مرة.
- تشكل مُحمّلات الفئات المدمجة سلسلة أصل (bootstrap، ومنصة، وتطبيق) تقوم بالتفويض صعودًا.
- تُعد مُحمّلات الفئات المخصصة سببًا في قدرة تعديلات Minecraft على تصحيح فئات اللعبة أثناء تحميلها.
يُعدّ مُحمّل الفئات (Classloader) جزءًا من وقت تشغيل جافا الذي يحدد موقع ملف الفئة ويحمّله إلى آلة جافا الافتراضية (JVM) لكي يتمكن البرنامج من استخدامه. ليست جميع الفئات محمّلة عند بدء التشغيل. تقوم آلة جافا الافتراضية بتحميل كل فئة في المرة الأولى التي تكون فيها مطلوبة، ومُحمّل الفئات هو المسؤول عن تحديد موقع رمز البايت (bytecode) وقراءته وتسليمه إلى آلة جافا الافتراضية. تعمل نسخة جافا من ماينكرافت (Minecraft Java Edition) على هذا الآلية تحديدًا.
أين Opal يناسب
Opal هو تعديل Fabric، ويقوم Fabric بتحميل اللعبة من خلال مُحمِّل الفئات الخاص به، بحيث يمكن للتعديلات تصحيح الفئات أثناء تحميلها. يوضح دليل الإعداد كيفية تثبيته
ما الذي يفعله مُحمِّل الفئات فعليًا
يقوم مُحمِّل الفئات بتحويل اسم فئة إلى فئة قابلة للاستخدام داخل جهاز JVM قيد التشغيل. تطلب نوعًا ما، فيقوم المُحمِّل بتحديد بايتات .class المطابقة، ويقوم جهاز JVM بتعريف هذا النوع في الذاكرة.
يحدث العمل في ثلاث خطوات. يجد المُحمِّل التعليمات البرمجية الثنائية لفئة مُسماة. يقوم جهاز JVM بالتحقق منها وربطها. ثم تصبح الفئة جاهزة للاستخدام. هذا هو السبب في أن برنامج Java يمكنه استيراد التعليمات البرمجية التي لم يذكرها في وقت الترجمة: الاسم يكفي المُحمِّل للعثور عليها.
تسلسل مُحمّلات الفئات
يتم ترتيب مُحمّلات الفئات في سلسلة رئيسية، ومعظمها يسأل الأصل أولاً. يحتوي التطبيق القياسي على ثلاثة مُحمّلات مُدمجة مكدسة فوق بعضها البعض.
| المُحمِّل | يحمّل |
|---|---|
| Bootstrap | فئات وقت التشغيل الأساسية لـ Java |
| Platform | وحدات المكتبة القياسية خارج الأساس |
| Application | فئات برنامجك الخاصة من مسار الفئة |
عندما يُطلب من مُحمِّل التطبيق فئة، فإنه يفوض عادةً للأعلى أولاً. يحصل الأصل على فرصة لتحميلها، وفقط إذا لم يتمكن أي من الأصول يفعل ذلك، يحاول الطفل. يسمى هذا النموذج التفويض، ويحافظ على اتساق الأنواع الأساسية في جميع أنحاء البرنامج.
هوية الفئة ومُحمّلات الفئات المخصصة
يتم تحديد الفئة من خلال كل من اسمها والتحميل الذي يعرفها. يمكن لكل من برنامجين للتحميل تحميل فئة بنفس الاسم، ويعاملها جهاز JVM على أنها نوعين مختلفين. قد يبدو هذا تفصيلاً بسيطاً، ولكنه هو السبب الرئيسي لقوة برامج التحميل.
يمكن للبرامج تحديد برامج تحميل خاصة بها. يمكن للمحمل المخصص قراءة التعليمات البرمجية الثنائية من أي مكان: ملف jar، الشبكة، مصفوفة بايت تم إنشاؤها، أو حتى التعليمات البرمجية الثنائية التي تم تحويلها أثناء العملية. هذا هو كيف تعمل أنظمة المكونات الإضافية، وخوادم التطبيقات، وأطر عمل التعديل على تحميل التعليمات البرمجية التي لم يعرفها البرنامج المضيف في وقت الإنشاء.
لماذا هذا مهم لتعديلات Minecraft
توجد التعديلات بفضل التحميل المخصص للفئات. يبدأ برنامج تحميل التعديلات الخاص بـ Minecraft اللعبة من خلال برنامج تحميل خاص به حتى يتمكن من رؤية وتعديل فئات اللعبة أثناء تحميلها. هذا نقطة الربط التي يحدث فيها تصحيح التعليمات البرمجية الثنائية.
عندما يجلس برنامج التحميل بين القرص وجهاز JVM، يمكنه تحويل فئة مباشرة قبل أن يعرفها جهاز JVM. يمكن للتعديل إعادة كتابة طريقة اللعبة، أو حقن سلوك جديد، أو إضافة حقول، كل ذلك بدون نسخة معدلة من اللعبة على القرص. الفئة التي ينتهي جهاز JVM بتشغيلها هي الفئة التي تم تصحيحها. لمزيد من المعلومات حول كيفية توافق ذلك مع الصورة الأكبر، راجع ما هو برنامج تحميل تعديلات Minecraft؟.
الأسئلة الشائعة
عند الاستخدام الأول، وليس عند بدء التشغيل. في المرة الأولى التي يتفاعل فيها الكود الخاص بك مع نوع ما، يطلب جهاز الآلة الافتراضية (JVM) من مُحمِّل الفئات (classloader) العثور عليه وتحديده. يُطلق على ذلك التحميل الكسول
يطلب مُحمِّل ما، من محمله الأصلي، تحميل فئة قبل أن يحاول تحميل نفسه. وتتجه سلسلة المحملين إلى مُحمِّل الإقلاع، الذي يمنع تحميل أنواع Java الأساسية مرتين بنفس الاسم
نعم، إذا عرّفتها تحميلات الفئات المختلفة. تحدد JVM الفئة من خلال اسمها بالإضافة إلى المحمّل الذي يعرفها، لذا فإن الفئات التي تحمل نفس الاسم من تحميلات منفصلة هي أنواع متميزة
لمعرفة كيفية تحميل وتصحيح فئات اللعبة في الذاكرة. يمكن لمُحمِّل مخصص تحويل التعليمات البرمجية الثنائية قبل أن تعرفها الآلة الافتراضية للجافا، وهو ما يتيح للتعديلات تغيير اللعبة دون تعديلها على القرص