小编典典

编译器为自动装箱生成什么代码?

java

当Java编译器将原语自动包装到包装类时,它在幕后生成什么代码?我想象它调用:

  • 包装器上的valueOf()方法
  • 包装器的构造函数
  • 还有其他魔术吗?

阅读 279

收藏
2020-09-09

共1个答案

小编典典

您可以使用该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."<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

}

因此,如您所见,自动装箱将调用static方法Integer.valueOf(),而自动拆箱intValue()将在给定Integer对象上调用。没什么,真的-
只是语法糖。

2020-09-09