مراحل تحميل الفئات: التحميل والربط والتهيئة
تعرّف إلى تحميل الفئات والتحقق منها وتجهيزها وحلّها وتهيئتها
مراحل تحميل الفئات: التحميل والربط والتهيئة درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
دورة حياة تحميل الفئة
تمر فئة Java بثلاث مراحل قبل أن يمكن استخدامها: التحميل (العثور على الرمز الثنائي وقراءته)، والربط (التحقق والإعداد والحل)، والتهيئة (تشغيل المهيئات الساكنة).
المرحلة 1: التحميل
يقرأ ClassLoader ملف .class (من نظام الملفات أو JAR أو الشبكة أو الرمز الثنائي المُنشأ)، وينشئ كائنًا من النوع Class<?> في الكومة لتمثيله.
// Trigger loading explicitly:
Class<?> c = Class.forName("com.example.MyService");
// The JVM delegates to the appropriate ClassLoader to find and load MyService.classالمرحلة 2أ: التحقق
يتحقق مدقّق الرمز الثنائي من أن الرمز الثنائي المُحمّل صالح بنيويًا وآمن من حيث النوع ويتبع قواعد مواصفة JVM. ويؤدي الرمز الثنائي غير الصالح (مثل الرمز الذي عُدّل باستخدام ASM بطريقة غير صحيحة) إلى حدوث VerifyError.
المرحلة 2ب: الإعداد
تخصّص JVM ذاكرة للحقول الساكنة وتعيّن لها قيمها الافتراضية (0 وfalse وnull). ولم تُشغَّل المهيئات الساكنة بعد في هذه المرحلة.
public class Config {
static int timeout = 30; // after preparation: timeout = 0 (default)
static String host = "db"; // after preparation: host = null
// Both get their real values only after Initialization
}المرحلة 2ج: الحل
تُستبدل المراجع الرمزية (أسماء الفئات وتواقيع الدوال) في تجمع الثوابت بمراجع مباشرة (مؤشرات) إلى الفئات والدوال الفعلية. وقد يُؤجَّل ذلك، أي قد يحدث الحل بشكل كسول.
المرحلة 3: التهيئة
تُشغَّل المهيئات الساكنة (كتل static {}) وتعيينات الحقول الساكنة بالترتيب النصي. وفي هذه المرحلة تُنفَّذ فعليًا التعليمتان timeout = 30 وhost = "db".
public class Config {
static int timeout;
static String host;
static {
timeout = Integer.parseInt(System.getenv("TIMEOUT"));
host = System.getenv("DB_HOST");
System.out.println("Config initialized");
}
}مُشغِّلات تهيئة الفئة
تُجرى التهيئة عند أول حدوث لأي مما يلي: (1) إنشاء مثيل، (2) الوصول إلى حقل ثابت غير ثابت القيمة، (3) استدعاء طريقة ثابتة، (4) استخدام الانعكاس عبر Class.forName() (مع initialize=true)، (5) تهيئة فئة فرعية.
// forName with initialize=false skips static initializers:
Class<?> c = Class.forName("com.example.MyService", false, loader);الطريقة <clinit>
ينشئ JVM طريقة <clinit> (مُهيِّئ الفئة) من جميع المُهيِّئات الثابتة وإسنادات الحقول الثابتة. تُشغَّل هذه الطريقة مرة واحدة بالضبط، وهي آمنة للاستخدام مع الخيوط؛ إذ يضمن JVM الاستبعاد المتبادل.
ExceptionInInitializerError
إذا ألقى مُهيِّئ ثابت استثناءً، يغلّفه JVM داخل ExceptionInInitializerError. وتؤدي المحاولات اللاحقة لاستخدام الفئة إلى إلقاء NoClassDefFoundError.
static {
if (System.getenv("DB_URL") == null)
throw new RuntimeException("DB_URL not set"); // wrapped in ExceptionInInitializerError
}ترتيب التهيئة الثابتة
تُشغَّل المُهيِّئات الثابتة حسب ترتيبها النصي. وقد تؤدي التبعيات الدائرية بين الفئات أثناء التهيئة إلى فئات مهيّأة جزئيًا، وهي مشكلة شائعة مع نمط Initialization-on-Demand Holder.
class A {
static final int X = B.Y + 1; // accesses B before B is initialized!
}
class B {
static final int Y = A.X + 1; // circular!
}مراقبة تحميل الفئات
فعِّل مخرجات سجل تحميل الفئات باستخدام -Xlog:class+load=info (في JVM 9 والإصدارات الأحدث) لمعرفة الفئات التي حُمِّلت، ومصدر تحميلها، وClassLoader الذي حمّلها.
// JVM flag:
// java -Xlog:class+load=info:file=classload.log MyApp
// Output lines like:
// [info][class,load] com.example.MyService source: file:///app/app.jarتحقق سريع
أثناء أي مرحلة تُنفَّذ المُهيِّئات الثابتة؟
مراجعة
التحميل: قراءة bytecode. الربط: التحقق ← التجهيز (القيم الافتراضية الصفرية) ← الحل (المراجع الرمزية). التهيئة: تشغيل <clinit>. تُشغَّل التهيئة عند أول استخدام، وهي آمنة للاستخدام مع الخيوط. تؤدي التبعيات الدائرية أثناء التهيئة إلى أخطاء دقيقة يصعب اكتشافها.
الأسئلة الشائعة
هل درس «مراحل تحميل الفئات: التحميل والربط والتهيئة» مجاني؟
نعم — نص درس «مراحل تحميل الفئات: التحميل والربط والتهيئة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «مراحل تحميل الفئات: التحميل والربط والتهيئة»؟
تعرّف إلى تحميل الفئات والتحقق منها وتجهيزها وحلّها وتهيئتها تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «مراحل تحميل الفئات: التحميل والربط والتهيئة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مراحل تحميل الفئات: التحميل والربط والتهيئة
- التسلسل الهرمي لـ ClassLoader ومحملات الفئات المخصصة
- فحص البايت كود باستخدام javap
- ترجمة JIT والترجمة متعددة المستويات