ما يحتاج JVM إلى تحميله هو دفق ثنائي ، والذي يمكن أن يكون في شكل ملف .class أو نماذج أخرى. إذا قمت بتصميمها وفقًا لمعايير التحميل ، فلن تكون هناك مشكلة كبيرة.
ما يلي يحلل بشكل أساسي مسألة الآلية والمعايير:
أولاً ، دعنا نأخذ آلية التحميل لملفات فئة Java ، والتي تشبه آلية التحميل للمتغيرات. يقوم أولاً بتحميل ملف الفئة إلى الذاكرة ، ثم يتحقق ، ويخوض البيانات وتهيئة البيانات ، ويشكل أخيرًا نوع Java الذي يمكن للجهاز الظاهري استخدامه مباشرة. نظرًا لأن Java تعتمد آلية JIT ، فسيكون ذلك بطيئًا في التحميل ، ولكن مزاياها واضحة ، فإنها تتمتع مرونة عالية ودعم الاتصالات الديناميكية والاتصالات الديناميكية.
بعد ذلك ، دعنا نتحدث عن عملية تحميل الفصل:
تكون العملية الأساسية لتحميل الفصل بالترتيب التالي ، لكن بعضها ليس بدقة في هذا الترتيب ، وبعضها في الترتيب المضطرب. على سبيل المثال ، يتطلب التحميل الديناميكي التهيئة ثم التحليل.
1. التحميل
الأمر متروك للجهاز الظاهري لتقريره ، ولكن هناك أيضًا حالات يتم تنفيذ المرحلة أعلاه لأنه سيتم تنفيذ المرحلة التالية.
في هذا الوقت ، يقوم الجهاز الظاهري بثلاثة أشياء:
أولاً ، اقرأ الدفق الثنائي للملف من خلال اسم مؤهل تمامًا ؛
ثانياً ، ضع الأساليب الثابتة والمتغيرات في الملف في منطقة الطريقة ؛
ثالثًا ، قم بإنشاء كائن ووضعه في الكومة كبوابة وصول.
لاحظ أن الأول هو قراءة الدفق الثنائي ، ولا يوضح الملف الذي يتم قراءته منه أو من أين يتم قراءته. لذلك ، فإنه يخلق قابلية التوسع قوية في Java ، والتي يمكن أن تكون من جرة ، أو الرمز البريدي ، أو من طبقة الشبكة ، وطبقة قاعدة البيانات ، وما إلى ذلك.
أساسا إعلان الكائن والطريقة.
2. التحقق
تأكد من أن التدفق الثنائي يلبي متطلبات الجهاز الظاهري ولا يفي بـ VerifyRorror.
أولاً ، التحقق من تنسيق الملف ، سواء كانت هناك أرقام سحرية ، وما إذا كانت تفي بمتطلبات ملفات Java ؛
ثانياً ، التحقق من البيانات الوصفية ، سواء كان يتوافق مع مواصفات كود Java ، مثل ما إذا كانت الفئة المجردة قد تم إنشاء مثيل لها مباشرة ، ما إذا كانت الفئة العادية لديها كائن فئة الوالدين غير المباشر أو المباشر ، إلخ ؛ ثالثًا ، يقوم التحقق من Bytecode ، بتحليل تدفق البيانات وتدفق التحكم ، ويضمن أنه لن يكون هناك أي سلوك يضر بالجهاز الظاهري ، مثل ما إذا كان يجب استدعاء التعليمات غير الموجودة ، وما إذا كان سيتم تعيين الفئة الأصل إلى الفئة الفرعية ، وما إذا كان سيتم تعيين كائن إلى كائن من هذا النوع ، وما إلى ذلك ؛
رابعًا ، يمكن العثور على التحقق المرجعي الرمزي ، وخاصة ما إذا كان يمكن العثور على وصف للفئات والمتغيرات والطريقة ، مثل ما إذا كان يمكن العثور على الملف باسم مؤهل بالكامل ، سواء كان متاحًا ، إلخ ، إلخ.
حدد بشكل أساسي الهيكل الداخلي
3. الاستعداد
عادةً ما يكون تعيين قيمة أولية لمتغير فئة 0 قيمة مثل المتغير الثابت ، دون تعيين قيمة لمتغير مثيل.
4. التحليل
عملية تحويل المراجع الرمزية في تجمع ثابت إلى مراجع مباشرة. يشير المرجع الرمزي المذكور هنا إلى النوع المتغير ، ويشير المرجع المباشر إلى المقبض الذي يمكن تحديد موقعه مباشرة إلى الكائن. الفصل ، الطريقة ، الحقل ، تحليل الواجهة ، الحصول على الكائن ذي الصلة وفقًا للاسم المؤهل بالكامل ، واحصل على نوعه. إذا لم يكن هناك إمكانية الوصول إلى الفصل ، فسيتم طرح غير شرعي ، لن يتم إلقاء أي حقل nosuchfielderror ، ولن يتم إلقاء أي طريقة nosuchmethoderror ، إذا كانت فئة أم لا ، سيتم إلقاؤها.
5. التهيئة
تحميل فصول وموارد ضرورية وفقًا لمتطلبات البرنامج. لا يوجد سوى أربع حالات ، وتحتاج إلى تهيئة نشطة قبل أن تتمكن من إجراء العملية التالية ، لذلك يجب عليك أولاً إجراء الخطوات الأربع المذكورة أعلاه.
أولاً ، الفئات ذات الكلمات الرئيسية الجديدة أو الثابتة ، تقوم الجديدة بإنشاء كائنات ، والأحمال الثابتة الثابتة ، من الواضح أنه سيتم تهيئة هاتين الاثنين ؛
ثانياً ، إذا كنت تستخدم فصلًا ، فلا يوجد شيء يمكنك فعله حيال ذلك ؛
ثالثًا ، يجب تهيئة الطرق في فئة الانعكاس ، أليس كذلك؟
رابعا ، الفئة الرئيسية للتنفيذ ، الفئة التي تستخدم الطريقة الرئيسية. لا تحتاج مواقف التهيئة السلبية الأخرى إلى النظر فيها.
أمثلة صغيرة:
الفئة العامة الفئة الفئة الفائقة {static {system.out.println ("Superclass !!") ؛} قيمة int ثابتة عامة = 1 ؛} فئة فرعية من الفئة العامة العامة تمتد الفئة الفرعية الفائقة {static {system.out.println ("الفئة الفرعية !!) ؛} {system.out.println (subcleass.value) ؛ فائق الفائق superclass = فئة فرعية جديدة () ؛}} فاكهة سوبر !! 1SubClass !!تُظهر نتيجة التنفيذ مشكلة: عندما تستدعي الفئة الفرعية متغير الفئة الأصل ، لا يتم تهيئة الفئة الفرعية لأن علاقة الكود في هذا الوقت لا علاقة لها بالفئة الفرعية ؛ عند تهيئة الفئة الفرعية ، لا يتم تهيئة الفئة الأصل مرة أخرى لأنه تمت تهيئة الفئة الأصل في هيئة الطريقة الحالية. الفرق الوحيد بين الواجهة والفئة الأصل هو أن تهيئة الواجهة لا تتطلب الواجهة الأصل ، وسيتم تهيئتها فقط عند استخدام الواجهة الأصل ، وسيتم إنشاء نفس مُنشئ الفئة.
في هذا الوقت ، سيتم تحميل مُنشئ الفصل وسيتم تهيئة جميع المتغيرات في الفصل. بالطبع ، سيتم تهيئة فئة الوالدين قبل فئة الطفل.
6. الاستخدام
بعد التحميل ، كيفية تسميته ، الرسم ، الحساب ، إلخ.
7. إلغاء التثبيت
لم يعد الفصل
ما إذا كان الفئتان متساويتان بشكل رئيسي على التحميل الأول باستخدام نفس المحمل ، وعنوان الاسم الثاني المؤهل تمامًا هو نفسه
لماذا تسأل الأسئلة أعلاه؟ بعد ذلك ، سوف نتحدث عن آلية تحميل للجهاز الظاهري.
من منظور الأجهزة الافتراضية Java ، هناك نوعان من اللصوص الفئة ، يسمى أحدهما محمل النظام (Bootstrap ClassLoader) ، والآخر يسمى المحمل المخصص (يمتد classloader). ينقسم هذا إلى قسمين ، يُطلق على أحدهم محمل التطبيق والآخر يسمى محمل فئة التمديد ، والذي يتم تخلفه عمومًا إلى السابق ؛ ويتم تحميل التطبيق لدينا بشكل أساسي من قبل المحمولين الثلاثة أعلاه. العلاقة بين الثلاثة هي التطبيق> التمديد> bootsrap. تشير آلية تفويض الوالدين إلى مزيج من زوجين. يقوم المحمل الفرعي أولاً باستدعاء طريقة المحمل الأصل ، ولم يتم العثور على الكائن الهدف قبل استخدام اللودر الطفل.
الرمز الزائف كما يلي:
loadClass (اسم السلسلة ، حل منطقي) {class c = findloadedClass () if (c == null) {if (parent! = null) c = parent.loadClass (name ، false) ؛ c = findBootStrapClassornull (name) ؛} catch (classnotfoundException e)يدعو Java إلى أن نكتب منطق فصل الاتصال الخاص بنا في FindClass ، مما سيساعدنا على استخدام آلية التفويض الوالدين بشكل طبيعي.
تدمير 1. إعادة كتابة loadclass
تدمير 2. استخدم محمل سياق الخيط للسماح لوكيل الأصل بالاتصال بأسلوب تحميل الطفل
التدمير 3. الطريقة الشائعة الاستخدام للتحميل الساخن هي تخصيص محمل الفئة والكتابة فوق وحدة الأخطاء الأصلية - OSGI
ومع ذلك ، إذا تم الخلط بين القواعد بين اللوادر المخصصة وهناك مشكلة في الإشارة إلى بعضها البعض في نفس الوقت ، فلن يتم العثور على الفصل في النهاية ، وسوف تحدث تسربات الموتى وتسرب الذاكرة.
فيما يتعلق بالإصلاح الساخن ، والمعروف أيضًا باسم المكونات الإضافية ، فإن أكثرها شعبية هي الإصلاح الساخن ، Nuwa ، Droidfix ، و Fix ، إلخ. يمكن العثور على هذه الأطر على Github أو في أي مكان آخر. المبادئ على النحو الوارد أعلاه ، والطرق متنوعة ، وهناك تغطية ، وإعادة التوجيه ، وما إلى ذلك ، من خلال التكوين ، وإجراءات تعيين ، إلخ. كما المكونات الإضافية ، يجب الوفاء بالشروط التالية:
1. يمكن تثبيته بشكل مستقل ، ولكن لا يمكن تشغيله بشكل مستقل
2. كن متخلفًا ، يمكن توسيعه
3. يمكن تشغيله فقط في البرنامج المضيف ، ويمكن تعطيله أو استبداله
المثال أعلاه لآلية تحميل الجهاز الظاهري Java هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.