Qual o código que o compilador gerar para autoboxing?
-
03-07-2019 - |
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?
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
, umbyte
, umchar
na\u0000
intervalo para\u007f
, ou um númeroint
oushort
entre-128
e127
, 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 long
s 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.