字节码

字节码

如下简单的 Java 代码:

public static void main(String[] args) {
    int a = 1;
    int b = 2;
    int c = a + b;
}

// javac Test.java
// javap -v Test.class

编译而来的字节码如下所示:

// main 方法的签名
public static void main(java.lang.String[]);

// 第二部分的 descriptor 表示方法拥有一个类型为 [Ljava/lang/String; 的参数,返回值类型是 V
descriptor: ([Ljava/lang/String;)V

// 一系列指示符,ACC_PUBLIC 表明方法是 public 类型,ACC_STATIC 表明方法是 static 类型
flags: (0x0009) ACC_PUBLIC, ACC_STATIC

// 代码区
Code:

// stack 表示操作栈的最大深度,locals 表示本地变量数组的长度,args_size 表示参数的个数。在指令执行过程中,所有局部变量会陆续被操作,但 args 除外,它固定放在本地变量数组索引等于 0 的位置。
stack=2, locals=4, args_size=1

// 常量 1 推入操作栈
0: iconst_1

// 从操作栈弹出一个 int 值,存入索引为 1 的本地变量中,对应源码中的变量 a
1: istore_1

// 将常量 2 推入操作栈
2: iconst_2

// 从操作栈弹出一个 int 值,存入索引为 2 的本地变量中,对应源码中的变量 b
3: istore_2

// 从索引为 1 的本地变量中取出 int 值,推入操作栈
4: iload_1

// 从索引为 2 的本地变量中取出 int 值,推入操作栈
5: iload_2

// 从操作栈弹出两个 int 值,然后相加,并将结果推入操作栈
6: iadd

// 从操作栈弹出 int 值,存入索引为 3 的本地变量中,对应源码中的变量c
7: istore_3

8: return

...

Links

上一页