ما هو الكود الذي ينشئه المترجم من أجل التشغيل التلقائي؟
-
03-07-2019 - |
سؤال
عندما يقوم برنامج التحويل البرمجي Java تلقائيًا بدمج فئة بدائية في فئة المجمع، ما هو الكود الذي يقوم بإنشائه خلف الكواليس؟أتخيل أنه يدعو:
- طريقة valueOf () على الغلاف
- منشئ المجمع
- بعض السحر الآخر؟
المحلول
يمكنك استخدام ال javap
أداة لترى بنفسك.قم بتجميع الكود التالي:
public class AutoboxingTest
{
public static void main(String []args)
{
Integer a = 3;
int b = a;
}
}
لتجميع وتفكيك:
javac AutoboxingTest.java
javap -c AutoboxingTest
الإخراج هو:
Compiled from "AutoboxingTest.java"
public class AutoboxingTest extends java.lang.Object{
public AutoboxingTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_3
1: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
4: astore_1
5: aload_1
6: invokevirtual #3; //Method java/lang/Integer.intValue:()I
9: istore_2
10: return
}
وبالتالي، كما ترون، فإن العلبة التلقائية تستدعي الطريقة الثابتة Integer.valueOf()
, ، واستدعاءات إلغاء القفل التلقائي intValue()
على المعطى Integer
هدف.لا يوجد شيء آخر، حقًا، إنه مجرد سكر نحوي.
نصائح أخرى
لقد توصلت إلى اختبار وحدة يثبت أنه يتم استدعاء Integer.valueOf() بدلاً من مُنشئ الغلاف.
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import org.junit.Test;
public class Boxing {
@Test
public void boxing() {
assertSame(5, 5);
assertNotSame(1000, 1000);
}
}
إذا بحثت عن مستند API لـ عدد صحيح # قيمة (كثافة العمليات), ، سترى أنه تمت إضافته في JDK 1.5.جميع أنواع الأغلفة (التي لم تكن تحتوي عليها بالفعل) تمت إضافتها بطرق مماثلة لدعم التشغيل التلقائي.بالنسبة لأنواع معينة، هناك متطلبات إضافية، كما هو موضح في JLS:
إذا كانت القيمة ص يجري محاصر هو
true
,false
, ، أbyte
, ، أchar
في النطاق\u0000
ل\u007f
, ، أوint
أوshort
رقم بين-128
و127
, ، ثم السماح ص1 و ص2 تكون نتائج أي تحويلين للملاكمة ص.هذا هو الحال دائما ص1 == ص2. §5.1.7
ومن المثير للاهتمام أن نلاحظ ذلك long
لا تخضع s لنفس المتطلبات، على الرغم من أن القيم الطويلة في -128..127
يتم تخزين النطاق مؤقتًا في تطبيق Sun، تمامًا مثل الأنواع المتكاملة الأخرى.
لقد اكتشفت ذلك للتو في نسختي من لغة البرمجة جافا, ، انها تقول char
القيم من \u0000
ل \u00ff
يتم تخزينها مؤقتًا، ولكن بالطبع الحد الأعلى وفقًا للمواصفات هو \u007f
(ويتوافق Sun JDK مع المواصفات في هذه الحالة).
أوصي بالحصول على شيء مثل جاد وفك التعليمات البرمجية كثيرا.يمكنك معرفة القليل عما تفعله جافا بالفعل.