Domanda

Quando il compilatore Java inserisce automaticamente una primitiva nella classe wrapper, quale codice genera dietro le quinte? Immagino che chiami:

  • Il metodo valueOf () sul wrapper
  • Il costruttore del wrapper
  • Qualche altra magia?
È stato utile?

Soluzione

Puoi usare lo strumento javap per vedere di persona. Compilare il seguente codice:

public class AutoboxingTest
{
    public static void main(String []args)
    {
        Integer a = 3;
        int b = a;
    }
}

Per compilare e disassemblare:

javac AutoboxingTest.java
javap -c AutoboxingTest

L'output è:

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

}

Quindi, come puoi vedere, l'autoboxing invoca il metodo statico Integer.valueOf () e l'autounboxing invoca intValue () sul intero < codice> oggetto. Non c'è nient'altro, davvero - è solo zucchero sintattico.

Altri suggerimenti

Mi è venuto in mente un unit test che dimostra che Integer.valueOf () viene chiamato invece del costruttore del wrapper.

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);
    }
}

Se cerchi il documento API per Integer # valueOf (int) , vedrai che è stato aggiunto in JDK 1.5. Tutti i tipi di wrapper (che non li avevano già) avevano metodi simili aggiunti per supportare l'autoboxing. Per alcuni tipi esiste un requisito aggiuntivo, come descritto nella JLS:

  

Se il valore p in boxing è true , false , un byte , un carattere nell'intervallo da \ u0000 a \ u007f o un int o short compreso tra -128 e 127 , quindi lascia r1 e r2 i risultati di due conversioni di boxe di p . È sempre il caso r1 == r2 . §5.1.7

È interessante notare che i long non sono soggetti allo stesso requisito, sebbene i valori Long nell'intervallo -128..127 siano memorizzati nella cache nell'implementazione di Sun, proprio come gli altri tipi integrali.

Ho anche scoperto che nella mia copia di Il linguaggio di programmazione Java , indica i valori char da \ u0000 a \ u00ff sono memorizzati nella cache, ma ovviamente il limite superiore per la specifica è \ u007f (e il Sun JDK è conforme alla specifica in questo caso).

Consiglio di ottenere qualcosa come jad e di decompilare molto il codice. Puoi imparare un po 'di quello che sta facendo java.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top