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?
War es hilfreich?

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, ein byte, ein char im Bereich \u0000 \u007f oder eine int oder short Zahl zwischen -128 und 127, 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 longs 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top