ما هو الكود الذي ينشئه المترجم من أجل التشغيل التلقائي؟

StackOverflow https://stackoverflow.com/questions/408661

  •  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 مع المواصفات في هذه الحالة).

أوصي بالحصول على شيء مثل جاد وفك التعليمات البرمجية كثيرا.يمكنك معرفة القليل عما تفعله جافا بالفعل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top