Quale codice genera il compilatore per l'autoboxing?
-
03-07-2019 - |
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?
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
, unbyte
, uncarattere
nell'intervallo da\ u0000
a\ u007f
o unint
oshort
compreso tra-128
e127
, 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.