ملف فئة جافا
ملف فئة جافا هو ملف (يحمل الامتداد .class ) يحتوي على بايت كود جافا ، ويمكن تنفيذه على آلة جافا الافتراضية (JVM) . عادةً ما يُنتج مُصرّف جافا ملف فئة جافا من ملفات مصدر لغة برمجة جافا ( ملفات .java ) التي تحتوي على فئات جافا (أو يمكن استخدام لغات JVM أخرى لإنشاء ملفات الفئات). إذا احتوى ملف المصدر على أكثر من فئة، تُصرّف كل فئة في ملف فئة منفصل. ولذلك، يُسمى ملف .class لأنه يحتوي على بايت كود فئة واحدة.
تتوفر آلات جافا الافتراضية (JVMs) للعديد من المنصات ، ويمكن تنفيذ ملف فئة مُجمَّع على منصة ما على آلة جافا افتراضية (JVM) لمنصة أخرى. وهذا يجعل تطبيقات جافا مستقلة عن المنصة .
تاريخ
في 11 ديسمبر 2006، تم تعديل تنسيق ملف الفئة بموجب طلب مواصفات جافا (JSR) 202. [ 1 ]
تخطيط وبنية الملف
الأقسام
يتكون هيكل ملف فئة جافا من 10 أقسام أساسية:
- الرقم السحري :
0xCAFEBABE - إصدار تنسيق ملف الفئة : الإصداران الفرعي والرئيسي لملف الفئة
- مجموعة الثوابت : مجموعة من الثوابت الخاصة بالفئة
- علامات الوصول : على سبيل المثال، ما إذا كانت الفئة مجردة، أو ثابتة، أو ما إلى ذلك.
- هذا الفصل : اسم الفصل الحالي
- الفئة الممتازة : اسم الفئة الممتازة
- الواجهات : أي واجهات في الفئة
- الحقول : أي حقول في الفئة
- الأساليب : أي أساليب في الفئة
- السمات : أي سمات للفئة (على سبيل المثال اسم ملف المصدر، وما إلى ذلك).
الرقم السحري
تُعرَّف ملفات الفئات بواسطة رأسية مكونة من 4 بايتات (بالنظام الست عشري ): (أول 4 إدخالات في الجدول أدناه). وقد شرح جيمس جوسلينج تاريخ هذا الرقم السحري بالإشارة إلى مطعم في بالو ألتو : [ 2 ]CA FE BA BE
كنا نذهب لتناول الغداء في مكان يُدعى زقاق سانت مايكل. تقول الأسطورة المحلية إنه في غابر الأزمان، كانت فرقة غريتفول ديد تُحيي حفلاتها هناك قبل شهرتها. كان مكانًا مميزًا، يُناسب أجواء غريتفول ديد تمامًا. حتى أنهم بنوا ضريحًا صغيرًا على الطراز البوذي بعد وفاة جيري . كنا نُطلق على المكان اسم "مقهى الموتى" عندما كنا نذهب إليه. في وقت ما، لاحظنا أن هذا الاسم هو رقم سداسي عشري. كنتُ أُعيد تصميم بعض أكواد تنسيق الملفات، واحتجتُ إلى رقمين مميزين : أحدهما لملف الكائن الدائم، والآخر للفئات. استخدمتُ CAFEDEAD لتنسيق ملف الكائن، وأثناء البحث عن كلمات سداسية عشرية من أربعة أحرف تلي كلمة "CAFE" (بدا أنها فكرة جيدة)، وجدتُ كلمة BABE وقررتُ استخدامها. في ذلك الوقت، لم يبدُ الأمر مهمًا جدًا، أو أنه سيُنسى تمامًا. وهكذا أصبح CAFEBABE تنسيق ملف الفئات، وCAFEDEAD هو تنسيق ملف الكائن الدائم. تنسيق الكائن. لكن خاصية الكائن الدائم اختفت، ومعها اختفى استخدام CAFEDEAD - وتم استبدالها في النهاية بـ RMI .
التصميم العام
نظرًا لأن ملف الفئة يحتوي على عناصر ذات أحجام متغيرة ولا يحتوي أيضًا على إزاحات ملفات مضمنة (أو مؤشرات)، فإنه يُحلل عادةً بشكل تسلسلي، من البايت الأول إلى النهاية. على أدنى مستوى، يُوصف تنسيق الملف من حيث بعض أنواع البيانات الأساسية:
- u1 : عدد صحيح غير مُوقّع من 8 بت
- u2 : عدد صحيح غير مُوقّع من 16 بت بترتيب البايتات الكبير (big-endian).
- u4 : عدد صحيح غير مُوقّع 32 بت بترتيب البايتات الكبير (big-endian).
- الجدول : عبارة عن مصفوفة من عناصر متغيرة الطول من نوع معين. يتم تحديد عدد العناصر في الجدول بواسطة رقم عد سابق (العدد هو u2)، ولكن لا يمكن تحديد حجم الجدول بالبايت إلا من خلال فحص كل عنصر من عناصره.
تُعاد تفسير بعض هذه الأنواع الأساسية كقيم ذات مستوى أعلى (مثل السلاسل النصية أو الأعداد العشرية)، وذلك حسب السياق. لا يوجد أي فرض لمحاذاة الكلمات، وبالتالي لا تُستخدم بايتات الحشو مطلقًا. يظهر التخطيط العام لملف الفئة في الجدول التالي.
| إزاحة البايت | مقاس | النوع أو القيمة | وصف |
|---|---|---|---|
| 0 | 4 بايت | u1 = 0xCA سداسي عشري | الرقم السحري (CAFEBABE) المستخدم لتحديد ما إذا كان الملف متوافقًا مع تنسيق ملف الفئة |
| 1 | u1 = 0xFE سداسي عشري | ||
| 2 | u1 = 0xBA سداسي عشري | ||
| 3 | u1 = 0xBE سداسي عشري | ||
| 4 | 2 بايت | u2 | رقم الإصدار الفرعي لتنسيق ملف الفئة المستخدم |
| 5 | |||
| 6 | 2 بايت | u2 | رقم الإصدار الرئيسي لتنسيق ملف الفئة المستخدم. [ 3 ] Java SE 26 = 70 (0x46 سداسي عشري)، Java SE 25 = 69 (0x45 سداسي عشري)، Java SE 24 = 68 (0x44 سداسي عشري)، Java SE 23 = 67 (0x43 سداسي عشري)، Java SE 22 = 66 (0x42 سداسي عشري)، Java SE 21 = 65 (0x41 سداسي عشري)، Java SE 20 = 64 (0x40 سداسي عشري)، Java SE 19 = 63 (0x3F سداسي عشري)، Java SE 18 = 62 (0x3E سداسي عشري)، Java SE 17 = 61 (0x3D سداسي عشري)، Java SE 16 = 60 (0x3C سداسي عشري)، Java SE 15 = 59 (0x3B سداسي عشري)، Java SE 14 = 58 (0x3A سداسي عشري)، Java SE 13 = 57 (0x39 سداسي عشري)، Java SE 12 = 56 (0x38 سداسي عشري)، Java SE 11 = 55 (0x37 سداسي عشري)، Java SE 10 = 54 (0x36 سداسي عشري)، [ 4 ] Java SE 9 = 53 (0x35 سداسي عشري)، [ 5 ] Java SE 8 = 52 (0x34 سداسي عشري)، Java SE 7 = 51 (0x33 سداسي عشري)، Java SE 6.0 = 50 (0x32 سداسي عشري)، Java SE 5.0 = 49 (0x31 سداسي عشري)، JDK 1.4 = 48 (0x30 سداسي عشري)، JDK 1.3 = 47 (0x2F سداسي عشري)، JDK 1.2 = 46 (0x2E سداسي عشري)، JDK 1.1 = 45 (0x2D سداسي عشري). لمزيد من التفاصيل حول أرقام الإصدارات السابقة، راجع الحاشية 1 في مواصفات آلة Java™ الافتراضية، الإصدار الثاني. |
| 7 | |||
| 8 | 2 بايت | u2 | عدد المدخلات في جدول المدخلات الثابتة التالي. هذا العدد أكبر بواحد على الأقل من العدد الفعلي للمدخلات؛ انظر المناقشة التالية. |
| 9 | |||
| 10 | حجم الملف (متغير) | طاولة | جدول مجمع الثوابت، وهو عبارة عن مصفوفة من مدخلات مجمع الثوابت ذات الأحجام المتغيرة، تحتوي على عناصر مثل الأرقام الحرفية والسلاسل النصية ومراجع إلى الفئات أو الأساليب. يتم فهرسة العناصر بدءًا من 1، ويحتوي الجدول على ( عدد مدخلات مجمع الثوابت - 1) إجمالاً (انظر الملاحظة). |
| ... | |||
| ... | |||
| ... | |||
| حجم الملف 10+ | 2 بايت | u2 | علامات الوصول، قناع بت |
| 11+ حجم الملف | |||
| حجم الملف 12+ | 2 بايت | u2 | يُحدد هذا الصنف، ويُفهرس في مجموعة الثوابت إلى مدخل من نوع "صنف". |
| حجم الملف الشخصي 13+ | |||
| حجم الملف الشخصي 14+ | 2 بايت | u2 | يُحدد الفئة العليا ، ويُفهرس في مجموعة الثوابت إلى مدخل من نوع "فئة". |
| حجم الملف 15+ | |||
| حجم الملف الشخصي 16+ | 2 بايت | u2 | عدد الواجهات، عدد الإدخالات في جدول الواجهات التالي |
| 17+ حجم الملف الشخصي | |||
| 18+ cpsize | الحجم (متغير) | طاولة | جدول الواجهات: مصفوفة متغيرة الطول من مؤشرات مجمع ثابتة تصف الواجهات التي تنفذها هذه الفئة |
| ... | |||
| ... | |||
| ... | |||
| 18+ cpsize + isize | 2 بايت | u2 | عدد الحقول، عدد الإدخالات في جدول الحقول التالي |
| 19+ حجم_اللوحة_الرئيسية + حجم_اللوحة | |||
| 20+ حجم_الملف + حجم_الملف | حجم الملف (متغير) | طاولة | جدول الحقول، مصفوفة حقول ذات طول متغير كل عنصر عبارة عن بنية field_info مُعرّفة في https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.5 |
| ... | |||
| ... | |||
| ... | |||
| 20+ حجم_البرنامج + حجم_البرنامج + حجم_الملف | 2 بايت | u2 | عدد الطرق، عدد الإدخالات في جدول الطرق التالي |
| 21+ حجم_الكمبيوتر + حجم_الجهاز + حجم_الإطار | |||
| 22+ حجم_الكمبيوتر + حجم_الجهاز + حجم_الإطار | حجم m (متغير) | طاولة | جدول الأساليب، مصفوفة أساليب ذات طول متغير كل عنصر عبارة عن بنية method_info مُعرّفة في https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.6 |
| ... | |||
| ... | |||
| ... | |||
| 22+ cpsize + isize + fsize + msize | 2 بايت | u2 | عدد السمات، عدد الإدخالات في جدول السمات التالي |
| 23+ cpsize + isize + fsize + msize | |||
| 24+ cpsize + isize + fsize + msize | الحجم (متغير) | طاولة | جدول السمات، مصفوفة سمات ذات طول متغير كل عنصر عبارة عن بنية معلومات السمة المحددة في https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7 |
| ... | |||
| ... | |||
| ... |
تمثيل ملف فئة
فيما يلي تمثيل لملف .class كما لو كان بنية على نمط لغة C.
struct ClassFileFormat { u4 magicNumber ;u2 minorVersion ; u2 majorVersion ;u2 constantPoolCount ; ConstantPoolInfo [ constantPoolCount - 1 ] constantPool ;u2 accessFlags ;u2 thisClass ; u2 superClass ;u2 interfacesCount ; u2 [ interfacesCount ] interfaces ;u2 fieldsCount ; FieldInfo [ fieldsCount ] fields ;u2 methodsCount ; MethodInfo [ methodsCount ] methods ;u2 attributesCount ; AttributeInfo [ attributesCount ] attributes ; }المسبح الدائم
يُخزَّن معظم القيم الثابتة الحرفية في جدول تجميع الثوابت. ويشمل ذلك قيمًا مثل الأرقام بجميع أنواعها، والسلاسل النصية، وأسماء المعرّفات، ومراجع الفئات والأساليب، ومُعرِّفات الأنواع. تُعطى جميع الفهارس، أو المراجع، لثوابت مُحدَّدة في جدول تجميع الثوابت بأرقام 16 بت (من النوع u2)، حيث تشير قيمة الفهرس 1 إلى الثابت الأول في الجدول (قيمة الفهرس 0 غير صالحة).
بسبب خيارات تاريخية اتُخذت أثناء تطوير تنسيق الملف، فإن عدد الثوابت في جدول تجميع الثوابت لا يتطابق فعليًا مع عدد الثوابت في التجميع الذي يسبق الجدول. أولًا، يبدأ فهرسة الجدول من 1 (بدلًا من 0)، ولكن يجب تفسير العدد على أنه أعلى فهرس مضافًا إليه واحد. [ 6 ] إضافةً إلى ذلك، يشغل نوعان من الثوابت (الأعداد الطويلة والأعداد العشرية) خانتين متتاليتين في الجدول، مع العلم أن الخانة الثانية هي فهرس وهمي لا يُستخدم مباشرةً.
يُحدد نوع كل عنصر (ثابت) في مجموعة الثوابت بواسطة علامة بايت أولية . ويعتمد عدد البايتات التي تلي هذه العلامة وتفسيرها على قيمة العلامة. أنواع الثوابت الصالحة وقيم علاماتها هي:
| بايت العلامة | بايتات إضافية | وصف الثابت | تم طرح الإصدار |
|---|---|---|---|
| 1 | 2+ x بايت (متغير) | سلسلة UTF-8 (يونيكود): سلسلة أحرف مسبوقة برقم مكون من 16 بت (من النوع u2) يشير إلى عدد البايتات في السلسلة المشفرة التي تليها مباشرةً (والذي قد يختلف عن عدد الأحرف). تجدر الإشارة إلى أن التشفير المستخدم ليس UTF-8 فعليًا ، بل هو تعديل طفيف على صيغة التشفير القياسية لليونيكود. | 1.0.2 |
| 3 | 4 بايت | عدد صحيح: عدد ثنائي مكمل ذو 32 بت مُوقّع بتنسيق big-endian | 1.0.2 |
| 4 | 4 بايت | العدد العائم: عدد ذو دقة مفردة مكون من 32 بت وفقًا لمعيار IEEE 754 | 1.0.2 |
| 5 | 8 بايت | Long: عدد مكمل ثنائي ذو 64 بت موقع بتنسيق big-endian (يأخذ خانتين في جدول تجميع الثوابت) | 1.0.2 |
| 6 | 8 بايت | Double: عدد ذو دقة مزدوجة 64 بت وفقًا لمعيار IEEE 754 (يأخذ خانتين في جدول تجميع الثوابت) | 1.0.2 |
| 7 | 2 بايت | مرجع الفئة: فهرس داخل مجموعة الثوابت لسلسلة UTF-8 تحتوي على اسم الفئة المؤهل بالكامل ( بالتنسيق الداخلي ) (big-endian) | 1.0.2 |
| 8 | 2 بايت | مرجع السلسلة: فهرس داخل مجموعة الثوابت لسلسلة UTF-8 (بما في ذلك big-endian) | 1.0.2 |
| 9 | 4 بايت | مرجع الحقل: مؤشران ضمن مجموعة الثوابت، يشير الأول إلى مرجع فئة، والثاني إلى وصف الاسم والنوع. (ترتيب البايتات الكبير) | 1.0.2 |
| 10 | 4 بايت | مرجع الأسلوب: مؤشران ضمن مجموعة الثوابت، يشير الأول إلى مرجع فئة، والثاني إلى وصف الاسم والنوع. (ترتيب البايتات الكبير) | 1.0.2 |
| 11 | 4 بايت | مرجع أسلوب الواجهة: مؤشران ضمن مجموعة الثوابت، يشير الأول إلى مرجع فئة، والثاني إلى وصف الاسم والنوع. (ترتيب البايتات الكبير) | 1.0.2 |
| 12 | 4 بايت | اسم ووصف النوع: مؤشران لسلاسل UTF-8 داخل مجموعة الثوابت، الأول يمثل اسمًا (معرفًا) والثاني وصف نوع مشفر بشكل خاص. | 1.0.2 |
| 15 | 3 بايت | معرّف الطريقة: يُستخدم هذا الهيكل لتمثيل معرّف الطريقة ويتكون من بايت واحد من واصف النوع، متبوعًا بفهرس داخل مجموعة الثوابت. [ 6 ] | 7 |
| 16 | 2 بايت | نوع الطريقة: يُستخدم هذا الهيكل لتمثيل نوع الطريقة، ويتكون من فهرس ضمن مجموعة الثوابت. [ 6 ] | 7 |
| 17 | 4 بايت | ديناميكي: يُستخدم هذا لتحديد ثابت محسوب ديناميكيًا يتم إنتاجه عن طريق استدعاء طريقة التمهيد. [ 6 ] | 11 |
| 18 | 4 بايت | InvokeDynamic: يُستخدم هذا بواسطة تعليمة invokedynamic لتحديد طريقة التمهيد، واسم الاستدعاء الديناميكي، وأنواع الوسائط والإرجاع للاستدعاء، واختياريًا، سلسلة من الثوابت الإضافية تسمى الوسائط الثابتة لطريقة التمهيد. [ 6 ] | 7 |
| 19 | 2 بايت | الوحدة: تُستخدم هذه الكلمة لتحديد الوحدة. [ 6 ] | 9 |
| 20 | 2 بايت | الحزمة: تُستخدم هذه الخاصية لتحديد حزمة تم تصديرها أو فتحها بواسطة وحدة نمطية. [ 6 ] | 9 |
يوجد نوعان فقط من الثوابت الصحيحة، وهما integer و long. أما الأنواع الصحيحة الأخرى التي تظهر في لغات البرمجة عالية المستوى، مثل boolean و byte و short، فيجب تمثيلها كثابت صحيح.
تُفصل أسماء الفئات في جافا، عند تحديدها بالكامل، بنقاط تقليدية، مثل "java.lang.Object". ومع ذلك، ضمن ثوابت مرجع الفئة منخفضة المستوى، يظهر شكل داخلي يستخدم الشرطات المائلة بدلاً من ذلك، مثل "java/lang/Object".
على الرغم من تسميتها "سلسلة UTF-8"، فإن سلاسل Unicode لا تُشفّر فعليًا وفقًا لمعيار Unicode، مع أنها متشابهة. ثمة فرقان (راجع UTF-8 لمزيد من التفاصيل). أولهما أن نقطة الترميز U+0000 تُشفّر كتسلسل ثنائي البايت C0 80(بالنظام الست عشري) بدلًا من التشفير القياسي أحادي البايت 00. أما الفرق الثاني، فهو أن الأحرف الإضافية (التي تقع خارج نطاق BMP عند U+10000 وما فوق) تُشفّر باستخدام بنية أزواج بديلة مشابهة لـ UTF-16 بدلًا من تشفيرها مباشرةً باستخدام UTF-8. في هذه الحالة، يُشفّر كل من البديلين بشكل منفصل في UTF-8. على سبيل المثال، يُشفّر U+1D11E كتسلسل سداسي البايت ED A0 B4 ED B4 9E، بدلًا من تشفير UTF-8 الصحيح رباعي البايت F0 9D 84 9E.
انظر أيضاً
مراجع
للمزيد من القراءة
- تيم ليندهولم ، فرانك يلين (1999). مواصفات آلة جافا الافتراضية ( الطبعة الثانية). برنتيس هول. ISBN 0-201-43294-3تم الاطلاع عليه بتاريخ 13-10-2008 .الوثيقة الرسمية التي تُعرّف آلة جافا الافتراضية ، والتي تتضمن تنسيق ملفات الفئات. كلا الطبعتين الأولى والثانية من الكتاب متاحتان مجانًا عبر الإنترنت للعرض و/أو التنزيل .
- تنسيقات ملفات الحاسوب
- جافا (منصة برمجية)
