English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تفسير آلية تحميل JAVA (موصى به)

يتمثل ترجمة المصدر في ثلاث خطوات:

1. آلية ترجمة المصدر

2. آلية تحميل الفئة

3. آلية تنفيذ الفئة

سنقوم هنا بشرح هذين الميكانيزمين: الترجمة والتحميل.

أولاً، ترجمة المصدر

يتم ترجمة الكود عن طريق محول JAVA المصدر. وهو يهدف إلى تحويل ملفات المصدر إلى ملفات كود ثنائي (ملفات class). يتم تقسيم صيغة ملفات الكود الثنائي إلى جزأين رئيسيين: مكتبة الثوابت ومكتبة الكود.

ثانيًا، تحميل الفئة

يعتبر دورة حياة الفئة من بدايتها في ذاكرة الـ JVM إلى انتهائها من الذاكرة. ويتميز هذا العملية بسبع مراحل، حيث تكون جميع المراحل قبل التحميل هي جزء من عملية تحميل الفئة.

تحميل----تحقق----إعداد----تحليل-----تحميل----استخدام-----إزالة

قد يقوم النظام بتحميل الفئة عند استخدامها لأول مرة، أو قد يستخدم آلية التحميل المسبق لتحميل الفئة، عند تشغيل برنامج Java، يتم بدء عملية تشغيل عملية الـ JVM، وسيكون هناك فرقان بين عملية تشغيل البرنامجين Java في فرقان مختلفين من عملية الـ JVM، لن يشارك الـ JVM بينهما بيانات.

1. مرحلة التحميل

هذا عملية التحميل هي إحدى مراحل آلية تحميل الفئات، لا يجب الخلط بين هذه المفاهيم، والأمور التي يجب إنجازها في هذه المرحلة تشمل:

1) يتم الحصول على تدفق البايتات الثنائية الممثل للفئة من خلال اسم الفئة الكامل.

2) يتم تحويل بنية التخزين الثابتة التي تمثلها تدفق البايتات إلى بنية البيانات في منطقة التخزين.

3) يتم إنشاء فئة Class تمثل هذه الفئة في(java heap) كمدخل للاستفادة من هذه البيانات في منطقة التخزين.

بسبب عدم تحديد كيفية الحصول على تدفق البايتات الثنائية للفئة وكيفية الحصول عليها في النقطة الأولى، يتم منح المطورين مساحة واسعة للتفكير في هذا الجزء. سأقوم بشرح هذا فيما بعد في محاضرة حول محول الفئات.

2- الخطوة التحضيرية

هذه الخطوة تخصص ذاكرة للمتغيرات الفئوية (المتغيرات التي يتم تعريفها باستخدام الكلمة المفتاح static) وتعيين قيم بدءية للمتغيرات الفئوية، وتحدث هذه التخصيص في منطقة الذاكرة.

1- لاحظ أن لم يتم تخصيص ذاكرة للمتغيرات المثلية هنا، وسيعين المتغيرات المثلية مع الأشياء عند إنشاء مثيل.

2- عادة ما تشير القيمة البدءية المحددة هنا إلى قيمة الصفر للنوع البياني.

private static int a = 3;
 قيمة المتغير الفئوي هذا بعد الخطوة التحضيرية هي 0، وإسناد القيمة 3 إلى المتغير a يحدث في الخطوة التحضيرية.

3- الخطوة التحضيرية

الخطوة الأخيرة في آلية التحميل للفئة، حيث يبدأ التنفيذ فعليًا للبرنامج JAVA المحدد في الفئة. في الخطوة التحضيرية السابقة، تم تعيين قيمة بدءية للمتغيرات الفئوية مرة واحدة وفقًا للمتطلبات النظام، وفي الخطوة التحضيرية يتم التركيز على عملية تحديد قيمة بدءية للمتغيرات الفئوية، والتركيز الرئيسي هو ترتيب عملية تحديد قيمة بدءية للموارد بين الفئات الأم والفئات الفرعية.

يوجد طريقتان لتعريف قيمة بدءية للمتغيرات الفئوية في فئة JAVA: 1- تعريف قيمة بدءية للمتغير الفئوي عند إعلانه؛ 2- استخدام الكتلة التحضيرية الثابتة لتعريف قيمة بدءية للمتغير الفئوي.

موعد التشغيل

1- عند إنشاء مثيل للفئة، هناك: 1- استخدام كلمة المفتاح new لإنشاء المثال؛ 2- إنشاء المثال من خلال الت反射;3- إنشاء المثال من خلال التشكيل.

new Test();
Class.forName(\"com.mengdd.Test\

2- استدعاء طريقة الفئة (الطريقة الثابتة)

Test.doSomething();

3- الوصول إلى متغير الفئة أو وصفة الفئة، أو تعيين قيمة لمتغير الفئة. 

int b=Test.a;
Test.a=b;

4- تعريف فرعية للفئة المحددة. عند تعريف الفرعية، يتم تعريف جميع الفئات الأم.

5- باستخدام الأمر java.exe لتنفيذ فئة رئيسية معينة.

إلى جانب الطرق المذكورة أعلاه التي تؤدي إلى إطلاق تعريف الفئة تلقائيًا، فإن جميع طرق الوصول إلى الفئة أخرى لا تؤدي إلى إطلاق تعريف الفئة، وتُعرف بأنها الاستدعاء غير النشط.

1- عند استدعاء المتغيرات الثابتة للفئة الأم، لن يؤدي ذلك إلى إطلاق تعريف الفئة الفرعية.

public class SupClass
{
 public static int a = 123;
 static
 {
  System.out.println(\"supclass init\
 }
}
public class SubClass extends SupClass
{
 static
 {
  System.out.println(\"subclass init\
 }
}
public class Test
{
 public static void main(String[] args)
 {
  System.out.println(SubClass.a);
 }
}

نتيجة التنفيذ:

supclass init
123

2- من خلال تعريف مصفوفة للفئات، لن يتم إطلاق تعريف هذا الفئة.

public class SupClass
{
 public static int a = 123;
 static
 {
  System.out.println(\"supclass init\
 }
}
public class Test
{
 public static void main(String[] args)
 {
  SupClass[] spc = new SupClass[10];
 }
}

نتيجة التنفيذ:

3- عند استدعاء الكوادر، لن يتم تحميل الفئة.

public class ConstClass
{
 public static final String A= "MIGU";
 static
 {
  System.out.println("ConstCLass init");
 }
}
public class TestMain
{
 public static void main(String[] args)
 {
  System.out.println(ConstClass.A);
 }
}

نتيجة التنفيذ:

ميغو

عند تزيين متغير فئة باستخدام final، يتم تحديد قيمته عند التجميع وتوضع في خزانة القيم الثابتة، لذا عند الوصول إلى هذا المتغير الفئةي، فإنه يساوي الوصول مباشرة إلى خزانة القيم الثابتة وليس تحميل الفئة.

خطوات التحميل

1- إذا لم يتم تحميل وتوصيل الفئة بعد، فإن البرنامج يجب أن يحمي الفئة ويتوصل إليها.

2- إذا لم يتم تحميل الأب المباشر للفئة، فإنه يجب تحميل الأب المباشر أولاً.

3- إذا كانت هناك تعليمات التحميل في الفئة، فإن النظام يتبع هذه التعليمات التحميلية.

في الخطوة الثانية، إذا كان هناك أي خطوة أم لخطوة الأم، فإن النظام سيكرر هذه الخطوات الثلاث مرة أخرى لتحديث هذه الخطوة الأم، وفقًا للترتيب، الأول الذي يبدأ في التحميل دائمًا هو فئة java.lang.Object. عند استخدام أي فئة من قبل البرنامج، يضمن النظام أن يتم تحميل هذه الفئة وجميع فئات الأباء.

ما تم ذكره أعلاه هو آلية تحميل الكلاسات لغة جافا التي قدمها المحرر لكم، ونأمل أن يكون مفيدًا لكم!

بيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع المالك الأصلي بحقوق النشر، ويتم جمع المحتوى من قبل المستخدمين عبر الإنترنت بطرق تلقائية، ويتمتع هذا الموقع بعدم امتلاك حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فنرجو منك إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لإبلاغنا، وتقديم الأدلة ذات الصلة، وسنقوم بإزالة المحتوى المزعوم عن انتهاك حقوق النسخ فور التحقق من ذلك.

أعجبك