📚《深入浅出JVM字节码》

《Java虚拟机字节码:从入门到实战》的开源版本。作者通过自己的实战经验,整合出一套适合新手的高效学习教程。归纳并提炼知识点,制定合理路线,帮助读者更快掌握核心技术。


不同类型返回值对应的指令

与读写局部变量表和操作数栈一样,方法返回指令也对应有多条指令,每种基本数据类型对应一条指令,引用类型对应areturn指令,如下表所示。

指令的操作码 指令的助记符 操作数 描述
0xAC ireturn 返回int类型值
0xAD lreturn 返回long类型值
0xAE freturn 返回float类型值
0xAF dreturn 返回double类型值
0xB0 areturn 返回引用类型值
0xB1 return 无返回值返回

return指令用于无返回值方法,在java代码中,void方法我们可能不会写return,但编译器会自动加上return指令。以返回值为int、long基本数据类型为例,对应java代码如下。

public static int getInt(){
    return 1000000000;
}
public static long getLong(){
    return 1000000000000000000L;
}

使用javap命令输出这两个方法的字节码如下。

public static int getInt();
    descriptor: ()I
    Code:
       0: ldc           #2                  // int 1000000000
       2: ireturn

  public static long getLong();
    descriptor: ()J
    Code:
       0: ldc2_w        #3                  // long 1000000000000000000l
       3: lreturn

验证返回值类型为引用类型时使用的返回指令为areturn,代码如下。

public static User getObject(){
    return new User();
}
public static int[] getArray(){
    int[] array = new int[]{};
    return array;
}

使用javap查看编译后的字节码如下。

public static com.wujiuye.asmbytecode.book.third.model.User getObject();
    descriptor: ()Lcom/wujiuye/asmbytecode/book/third/model/User;
    Code:
       0: new           #5                  // class com/wujiuye/asmbytecode/book/third/model/User
       3: dup
       4: invokespecial #6                  // Method com/wujiuye/asmbytecode/book/third/model/User."<init>":()V
       7: areturn

  public static int[] getArray();
    descriptor: ()[I
    Code:
       0: iconst_0
       1: newarray       int
       3: astore_0
       4: aload_0
       5: areturn

从该例子可以看出,无论是数组还是对象,都是使用areturn指令。


发布于:2021 年 08 月 21 日
作者: 吴就业
链接: https://github.com/wujiuye/JVMByteCodeGitBook
来源: Github Pages 开源电子书《深入浅出JVM字节码》(《Java虚拟机字节码从入门到实战》的第二版),未经作者许可,禁止转载!


📚目录