مقدمة مفصلة لعملية تحميل فئة Java الأساسية
العملية الأساسية:
- قم بتحميل دفق البايت الثنائي الذي يحدد الفئة بناءً على الاسم المؤهل بالكامل للفئة.
- قم بتحويل بنية التخزين الثابت التي يمثلها دفق البايت إلى بنية بيانات وقت التشغيل في منطقة الطريقة
- قم بإنشاء كائن java.lang.class الذي يمثل هذه الفئة في الذاكرة ، واستخدمه كوسيلة للوصول إلى بوابات الوصول إلى البيانات المختلفة في هذه الفئة.
لا يتم إنشاء فئة الصفيف نفسها من خلال تحميل الفئة ، ولكن يتم إنشاؤها مباشرة بواسطة جهاز Java الظاهري ، ويتم تحميل نوع العنصر لفئة الصفيف بواسطة تحميل الفئة.
نوع عنصر فئة الصفيف: نوع المصفوفة بعد إزالة جميع الأبعاد.
التحقق من تنسيق الملف:
- 0xcafebaby يبدأ بالرقم السحري ؛
- يمكن للجهاز الظاهري الحالي التعامل مع رقم الإصدار الأساسي والثانوي ؛
- نوع ثابت
- فهرس نوع التنفيذ ؛
- نوع البيانات المشفرة UTF8 ،
التحقق من البيانات الوصفية: التحليل الدلالي للمعلومات الوصف Bytecode:
- ما إذا كان هناك فئة الوالدين ؛
- ما إذا كانت فئة الوالدين ترث الفئة المعدلة النهائية ؛
- ما إذا كانت الفئة غير المستخرجة تنفذ الأساليب التي يجب تنفيذها في الفئة أو الواجهة الأصل ؛
- الكتابة فوق الحقول والأساليب في الفصل ، التناقضات الزائدة ؛
التحقق من Bytecode: تحديد شرعية وتصحيح البرنامج من خلال تحليل التدفق الدلالي وتحكم تدفق التحكم ، والتحقق من تحليل الجسم.
- التحقق من مرجع الرمز: عندما يقوم الجهاز الظاهري بتحويل مرجع الرمز إلى مرجع مباشر ، في مرحلة التحليل ، فإنه يؤدي التحقق من المطابقة على المعلومات خارج الفصل نفسه.
- ما إذا كان يمكن العثور على الفئة المقابلة بأسماء مؤهلة بالكامل وصفتها الأحرف في المراجع الرمزية ؛
- يحدد ما إذا كانت هناك واصفات في الفئة التي تتطابق مع حقل الطريقة ، وكذلك الأساليب والحقول الموصوفة بالاسم البسيط ؛
- إمكانية الوصول إلى الفصول والحقول والأساليب في المراجع الرمزية.
التحضير: تخصيص الذاكرة لمتغيرات الفئة في منطقة الطريقة وتعيين القيمة الأولية لمتغيرات الفئة.
- عادة ما تكون القيمة الأولية هي القيمة الصفر لنوع البيانات ، ويتم تهيئة القيمة المعدلة النهائية مباشرة إلى القيمة المقابلة.
- متغيرات الفئة هي متغيرات معدلة بشكل ثابت ، تميز عن متغيرات المثيل.
التحليل: يستبدل الجهاز الظاهري المراجع الرمزية في التجمع الثابت مع العملية المرجعية المباشرة
Constant_Class_Info ، stonster_fieldref_info ، constant_methodref_info ..
- مرجع الرمز: تصف مجموعة من الرموز الهدف المشار إليه. يمكن استخدام أي شكل من أشكال الحرفية لتحديد الهدف دون الغموض. لا علاقة له بتنفيذ ذاكرة الجهاز الظاهري وبغض النظر عما إذا كان يتم تحميل الهدف المرجعي.
- المرجع المباشر: يرتبط مؤشر مباشرة إلى الهدف ، أو الإزاحة أو المقبض الموجود بشكل غير مباشر للهدف ، بالذاكرة التي تنفذها الجهاز الظاهري. يجب تحميل الكائن الهدف المرجعي المباشر.
- . . .
التهيئة: ابدأ في تنفيذ رمز برنامج Java في تعريف الفئة. قم بتنفيذ طريقة مُنشئ الفصل <cinit> () ،
<init> ():
- يقوم المترجم تلقائيًا بجمع إجراءات تعيين متغيرات الفئة في الفصل وفقًا لترتيب التعريف في ملف الفئة ويدمج عبارات كتلة البيان الثابتة. لا يمكن كتلة البيان الثابتة الوصول إلى المتغيرات المحددة من قبل.
- يختلف عن مُنشئ الفئة ، لا يلزم استدعاء مُنشئ الفئة الأصل كما هو موضح. يضمن الجهاز الظاهري أن يتم تنفيذ فئة الوالدين <init> () قبل تنفيذ الفئة الفرعية.
- يتم تنفيذ كتلة البيان الثابت في الفئة الأصل أولاً.
- <SINIT> () ليس ضروريًا للفئات أو الواجهات ، ولن يتم إنشاؤه إذا لم يكن هناك عملية تعيين متغيرة أو كتلة بيانات ثابتة.
- لا يحتاج <Sinit> () للواجهة إلى تنفيذ <Sinit> () للواجهة الأصل أولاً ، ولا يلزم فئة تنفيذ الواجهة نفسها <init> ().
- سلامة الخيط: يضمن الجهاز الظاهري أن <init> () مغلق ومزامنة بشكل صحيح في بيئة متعددة الخيوط. يمكن لخيط واحد فقط الوصول إلى <init> () لفئة التهيئة في نفس الوقت.
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!