当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《编译器为自动装箱生成了什么代码?》经验,为你挑选了2个好方法。

当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对象.没有别的,真的 - 这只是语法糖.



1> Adam Rosenfi..:

您可以使用该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对象.没有别的,真的 - 这只是语法糖.



2> Craig P. Mot..:

我想出了一个单元测试,证明调用了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);
    }
}

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有