Welcher Code generiert der Compiler für Autoboxing?
-
03-07-2019 - |
Frage
Wenn der Java-Compiler eine primitive auf die Wrapper-Klasse Autoboxen, welcher Code macht es hinter den Kulissen generieren? Ich stelle mir es nennt:
- Die Methode valueOf () auf der Umhüllung
- Die Wrapper-Konstruktor
- Einige andere Magie?
Lösung
Sie können die javap
Tool für sich selbst zu sehen. Kompilieren Sie den folgenden Code ein:
public class AutoboxingTest
{
public static void main(String []args)
{
Integer a = 3;
int b = a;
}
}
Zum Kompilieren und zu demontieren:
javac AutoboxingTest.java
javap -c AutoboxingTest
Die Ausgabe lautet:
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
}
So wie Sie sehen können, ruft Autoboxing die statische Methode Integer.valueOf()
und autounboxing ruft intValue()
auf dem gegebenen Integer
Objekt. Es gibt nichts anderes, wirklich -. Es ist nur syntaktischer Zucker
Andere Tipps
kam ich mit einem Unit-Test-up, das beweist, dass Integer.valueOf () anstelle der Wrapper Konstruktor aufgerufen wird.
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);
}
}
Wenn Sie die API doc nachschlagen Integer # valueOf (int) , Sie werden sehen, es wurde hinzugefügt, in JDK 1.5. Alle Wrapper-Typen (die nicht schon sie haben) hatten ähnliche Methoden hinzugefügt Autoboxing zu unterstützen. Für bestimmte Arten gibt es eine zusätzliche Anforderung, wie in der JLS beschrieben:
Wenn der Wert p eingerahmt wird, ist
true
,false
, einbyte
, einchar
im Bereich\u0000
\u007f
oder eineint
odershort
Zahl zwischen-128
und127
, dann lassen Sie r1 und r2 werden die Ergebnisse von zwei Boxen Umwandlungen von p . Es ist immer der Fall, dass r1 == r2 . §5.1.7
Es ist interessant festzustellen, dass long
s auf die gleiche Anforderung unterliegt, obwohl Lange Werte im -128..127
Bereich in Suns Implementierung zwischengespeichert werden, ebenso wie die anderen ganzzahligen Typen.
Auch entdeckte ich nur, dass in meiner Kopie von die Java Programming Language , heißt es char
Werte von \u0000
zu \u00ff
werden zwischengespeichert, aber natürlich die Obergrenze gemäß der Spezifikation ist \u007f
(und die Sun JDK entspricht die Spezifikation in diesem Fall).
Ich würde empfehlen, etwas zu bekommen, wie jad und decompiling Code viel. Sie können über ziemlich viel lernen, was Java tatsächlich tun.