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

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

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

表3-30 方法返回指令

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指令。