محمل الكلاسات في جافا Class Loader
- طلب تحميل كلاس في جافا
- تحميل الكلاس في جافا
- ربط الكلاس في لغة جافا Linking
- التهيئة في لغة جافا Initialization
في البداية, سبق و شرحنا طريقة عمل الكود الذي نكتبه بلغة جافا بشكل عام في دورة جافا و قلنا أنه كالتالي.
إذاً عندما تقوم بكتابة ملفات java يتم ترجمتها لترميز ثماني (byte-code) بواسطة المترجم (Compiler) فتصبح بصيغة class بطريقة معينة بحيث تستطيع فيها آلة جافا الإفتراضية JVM قراءة الكلاس و إستخدامه لاحقاً.
سنتحدث في هذا المقال عن طريقة تحميل الكلاسات بدقة أكثر في آلة جافا الإفتراضية.
طلب تحميل كلاس في جافا
يتم طلب تحميل كلاس معين عند أول إستخدام للكلاس من الكود, و يكون أول إستخدام للكلاس عن طريق إستخدام أي شيء ثابت (static) في الكلاس و يشمل ذلك الكونستركتور (constructor), و السبب الذي يعود وراء عدم تحميل آلة جافا الإفتراضية لجميع الكلاسات عند تشغيل البرنامج هو أن عملية تحميل الكلاس قد تتطلب تنزيل بيانات من الإنترنت و غيرها من العمليات التي تستغرق وقت و تسبب بطئ و قد لا يتم إستخدام الكلاس أصلاً.
يمكن طلب تحميل الكلاس يدوياً بإستخدام الدالة ()loadClass
.
تحميل الكلاس في جافا
عندما تتلقى آلة جافا الافتراضية طلب تحميل كلاس معين تستخدم نظام محملي الكلاسات (Class loaders), و يتكون هذا النظام من ثلاثة محملين مترابطين مع بعضهم و وظيفتهم هي العثور على بيانات الكلاس byte-code من خلال البحث عنه بإستخدام إسمه الكامل متضمناً أسماء الحزم الواقع فيها (مثلاً java.lang.String
) و تحويلها للكائن java.lang.Class
و هم كالتالي:
- محمل الكلاسات التمهيدي (BootStrap ClassLoader):
- يقوم محمل الكلاسات التمهيدي بتحميل الكلاسات الأساسية في لغة جافا و المتواجدة في المسار
jre/lib
, و هو مكتوب بالـ Native code و مضمن داخل آلة جافا الافتراضية. - محمل الكلاسات الملحق (Extension ClassLoader):
- هو إبن للمحمل التمهيدي و مهمته هي تحميل كلاسات ملحقات آلة جافا الافتراضية و الموجودة في المسار
jre/lib/ext
. - محمل كلاسات التطبيق (Application ClassLoader):
- هو إبن للمحمل الملحق و مهمته هي تحميل الكلاسات الموجودة في مسار الكلاسات classpath, و هو الذي يقوم بتحميل الكلاسات التي نكتبها في برامجنا.
طريقة تحميل الكلاس من أول محمل للكلاسات كالتالي:
- يتم معرفة إن كان الكلاس قد تم تحميله مسبقاً أم لا.
- إن لم يتم تحميله يقوم محمل الكلاسات بطلب تحميل الكلاس من محمل الكلاسات الأب.
- إذا فشل الأب يحاول الإبن تحميل الكلاس.
(المصدر GeeksForGeeks.org , تحت رخصة CC BY-SA 4.0)
ربط الكلاس في لغة جافا Linking
تتألف عملية ربط الكلاس بآلة جافا الإفتراضية ليتم تنفيذه من ثلاثة خطوات:
- التحقق من أن الترميز الثماني (bytecode) منطقي و مفهوم لآلة جافا الإفتراضية.
- تجهيز الكلاس من خلال حجز مساحة للمتغيرات الثابتة في الذاكرة و إعطاء القيم الإفتراضية لها.
- تحميل الكلاسات التي يشير إليها الكلاس المحمل, وهذه العملية لا تحدث دائماً.
(المصدر javatutorial.net, تحت رخصة CC BY-NC-SA 4.0)
التهيئة في لغة جافا Initialization
في هذه المرحلة تقوم آلة جافا الإفتراضية بتنفيذ جميع العمليات الثابتة مثل تعيين قيم المتغيرات الثابتة (static variables) و تنفيذ البلوكات الثابتة (static blocks).
class Example { //in the preparing phase x will contain the value 0 //after the initializing phase x will contain the value 20 private int x = 20; static { System.out.println("this is a static block and will be executed in the initializing phase"); } }
بعد كل هذه العمليات يصبح الكلاس جاهزاً للإستخدام و يمكن إنشاء كائنات منه.