当Java编译器将一个原语自动装箱到包装器类时,它会在幕后生成什么代码?我想它叫:
包装器上的valueOf()方法
包装器的构造函数
其他一些魔术?
Adam Rosenfi.. 45
您可以使用该javap
工具自己查看.编译以下代码:
public class AutoboxingTest { public static void main(String []args) { Integer a = 3; int b = a; } }
编译和反汇编:
javac AutoboxingTest.java javap -c AutoboxingTest
输出是:
Compiled from "AutoboxingTest.java" public class AutoboxingTest extends java.lang.Object{ public AutoboxingTest(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()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 }
因此,正如您所看到的,autoboxing调用静态方法Integer.valueOf()
,并且autounboxing调用intValue()
给定Integer
对象.没有别的,真的 - 这只是语法糖.
您可以使用该javap
工具自己查看.编译以下代码:
public class AutoboxingTest { public static void main(String []args) { Integer a = 3; int b = a; } }
编译和反汇编:
javac AutoboxingTest.java javap -c AutoboxingTest
输出是:
Compiled from "AutoboxingTest.java" public class AutoboxingTest extends java.lang.Object{ public AutoboxingTest(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()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 }
因此,正如您所看到的,autoboxing调用静态方法Integer.valueOf()
,并且autounboxing调用intValue()
给定Integer
对象.没有别的,真的 - 这只是语法糖.
我想出了一个单元测试,证明调用了Integer.valueOf()而不是包装器的构造函数.
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); } }