Pergunta

Quando os autoboxes compilador Java uma primitivos à classe de invólucro, o que o código será que geram nos bastidores? Imagino que chama:

  • O valueOf () método na embalagem
  • O construtor do invólucro
  • Algum outro mágica?
Foi útil?

Solução

Você pode usar a ferramenta javap para ver por si mesmo. Compilar o código a seguir:

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

Para compilar e desmontar:

javac AutoboxingTest.java
javap -c AutoboxingTest

A saída é:

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

}

Assim, como você pode ver, autoboxing invoca o método Integer.valueOf() estática e autounboxing invoca intValue() sobre o objeto dado Integer. Não há mais nada, realmente. - É apenas açúcar sintático

Outras dicas

Eu vim com um teste de unidade que prova que Integer.valueOf () é chamado em vez de construtor do 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 você olhar para cima o doc API para Integer # valueOf (int) , você verá que ele foi adicionado no JDK 1.5. Todos os tipos do invólucro (que já não tê-los) tiveram métodos semelhantes adicionados ao autoboxing apoio. Para certos tipos existe um requisito adicional, conforme descrito nas JLS:

Se o valor p ser encaixotado é true, false, um byte, um char na \u0000 intervalo para \u007f, ou um número int ou short entre -128 e 127, então deixe r1 e r2 ser os resultados de quaisquer duas conversões de boxe de p . É sempre o caso que r1 == r2 . §5.1.7

É interessante notar que longs não estão sujeitos ao mesmo requisito, embora Valores longos na faixa -128..127 são armazenados em cache na implementação da Sun, assim como os outros tipos integrais.

Eu também só descobriu que na minha cópia do linguagem de programação Java , diz valores char de \u0000 para \u00ff são armazenados em cache, mas é claro que o limite superior acordo com a especificação é \u007f (e os conforma Sun JDK para a especificação, neste caso).

Eu recomendo a obter algo como jad e decompiling código muito. Você pode aprender um pouco sobre o java está realmente fazendo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top