لماذا تستخدم محمل فئة؟
في لغة Java ، يتم الانتهاء من تحميل الفصل أثناء تشغيل البرنامج. على الرغم من أن هذه الاستراتيجية ستزيد قليلاً من الأداء عند تحميل الفصل ، إلا أنها ستوفر تطبيقات Java بدرجة عالية من المرونة. على سبيل المثال:
1. اكتب تطبيقًا موجهًا للواجهة وقد ينتظر حتى يتم تشغيله قبل تحديد الفئة الفرعية للتنفيذ ؛
2. يمكن للمستخدمين تخصيص محمل فئة ، مما يسمح للبرنامج بتحميل دفق ثنائي من الشبكة أو أماكن أخرى كجزء من رمز البرنامج في وقت التشغيل ؛ (هذا هو الأساس لمكونات Android ، التثبيت الديناميكي وتحديث APK)
لماذا تدرس عملية تحميل الفصل بأكملها؟
آلية تحميل الطبقة
يقوم JVM بتحميل ملف الفئة إلى الذاكرة ، ويتحقق ، وتوصيف البيانات وتهيئها ، ويشكل أخيرًا العملية الكاملة لنوع Java التي يمكن لـ JVM استخدامها مباشرة.
حمولة
قم بتحميل محتوى Bytecode لملف الفئة في الذاكرة ، وقم بتحويل البيانات الثابتة إلى بنية بيانات وقت التشغيل في منطقة الطريقة ، وقم بإنشاء كائن java.lang.Class الذي يمثل هذه الفئة في الكومة ، كبوابة الوصول لبيانات فئة منطقة الطريقة. تتطلب هذه العملية مشاركة محمل الفصل.
وصلة
عملية الجمع بين المدونة الثنائية لفئة Java في حالة تشغيل JVM
التهيئة
<clinit>() . يتم إنشاء طريقة مُنشئ الفئة <clinit>() بواسطة برنامج التحويل البرمجي يقوم تلقائيًا بجمع إجراءات المهمة لجميع متغيرات الفئة في الفصل ودمج البيانات في كتلة العبارة الثابتة (كتلة ثابتة).<clinit>() للفئة مقفلة ومزامنة بشكل صحيح في بيئة متعددة الخيوط.مثال 1:
الطبقة العامة demo01 {public static void main (string [] args) {a a = new a () ؛ System.out.println (A.Width) ؛ }} class a {public static int width = 100 ؛ // متغير ثابت ، حقل الحقل الثابت ثابت {system.out.println ("فئة التهيئة الثابتة A") ؛ العرض = 300 ؛ } public a () {system.out.println ("إنشاء كائن من الفئة A") ؛ }}تحليل:
يوضح:
هناك أكوام ، أكوام (أماكن تم إنشاؤها) ، ومناطق الطريقة في الذاكرة (في الواقع كومة خاصة)
1. عندما يقوم JVM بتحميل Demo01 ، يشكل أولاً البيانات الثابتة (متغيرات الفئة ، طرق الفئة ، الكود ...) في منطقة الطريقة. في الوقت نفسه ، سيتم تشكيل كائن java.lang.Class (كائن عاكس) في الكومة ، يمثل فئة Demo01. من خلال الكائن ، يمكن الوصول إلى الهيكل الثنائي الفئة. ثم قم بتحميل معلومات الفئة A المتغيرة ، وأيضًا تشكيل كائن A في الكومة ، يمثل الفئة A.
2. عند تنفيذ الطريقة الرئيسية ، سيتم تشكيل إطار مكدس الطريقة الرئيسية في المكدس ، وطريقة واحدة تتوافق مع إطار المكدس. إذا استدعت الطريقة الرئيسية طرقًا أخرى ، فستضغط عليها واحدة تلو الأخرى في المكدس. هناك متغير محلي من النوع A في الطريقة الرئيسية. في البداية ، قيمة a هي خالية. يتم استدعاء مُنشئ الفئة A من خلال New. يتم إنشاء طريقة A () في المكدس ويتم إنشاء الكائن في الكومة. ثم يتم دفع عنوان الكائن إلى A في المكدس. في هذا الوقت ، A لديه عنوان كائن.
3. عندما يتم استدعاء A.Width ، يتم استدعاء بيانات منطقة الطريقة.
عندما يتم تحميل فئة بالرجوع إليها ، سيتم تحميل الفصل مرة واحدة فقط
مرجع نشط للفئة (سيحدث تهيئة الفصل بالتأكيد)
java.lang.reflect لإجراء مكالمات الانعكاس إلى الفصل إشارة سلبية إلى الفصل (لن تحدث تهيئة الفصل)
مثال 2:
الفئة العامة demo01 {static {system.out.println ("التهيئة الثابتة demo01") ؛ } rems static void main (string [] args) يلقي الاستثناء {system.out.println ("الطريقة الرئيسية لـ DEMO01!") ؛ System.out.println (System.getProperty ("java.class.path")) ؛ // مرجع نشط // جديد a () ؛ // system.out.println (a.width) ؛ // class.forname ("com.sinosoft.test.a") ؛ // مرجع سلبي // system.out.println (a.max) ؛ // a [] as = new a [10] ؛ System.out.println (B.Width) ؛ // لن يتم تحميل الفئة B}}} الفئة B تمتد {static {system.out.println ("التهيئة الثابتة B") ؛ }} class a يمتد a_father {public static int width = 100 ؛ // متغير ثابت ، حقل المجال الثابت العام الثابت النهائي int max = 100 ؛ ثابت {system.out.println ("فئة التهيئة الثابتة A") ؛ العرض = 300 ؛ } public a () {system.out.println ("إنشاء كائن من الفئة A") ؛ }} class a_father يمتد الكائن {static {system.out.println ("التهيئة الثابتة a_father") ؛ }}لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.