📚《深入浅出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虚拟机字节码从入门到实战》的第二版),未经作者许可,禁止转载!
📚目录
订阅
订阅新文章发布通知吧,不错过精彩内容!
输入邮箱,提交后我们会给您发送一封邮件,您需点击邮件中的链接完成订阅设置。