字节码
字节码
如下简单的 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
- https://mp.weixin.qq.com/s/CH9D-E7fxuu462Q2S3t0AA Java 字节码增强探秘