我们举例代码
public class Read {
public static void main(String[] args) {
int a=20;
int b=30;
a+=1;
b+=15;
System.out.println((a+b)/2);
}
}
我们将他进行运行,我们就会在target
里面出现.class文件,我们需要进入
执行这个代码
javap -c Read.class
就会出现字节码
public static int cal();
Code:
0: bipush 20
2: istore_0
3: bipush 30
5: istore_1
6: iinc 0, 1
9: iinc 1, 15
12: iload_0
13: iload_1
14: iadd
15: iconst_2
16: idiv
17: ireturn
}
解读:
public static int cal();
Code:
0: bipush 20 //将常量值20压入操作数栈。这表示将整数值20放入栈顶
2: istore_0 //将操作数栈顶的值存储到局部变量0(即a)。即将栈顶的值20弹//出,并存储到变量a中。
3: bipush 30 //将常量值30压入操作数栈。这表示将整数值30放入栈顶。
5: istore_1 //操作数栈顶的值存储到局部变量1(即b)。即将栈顶的值30弹出,//并存储到变量b中。
6: iinc 0, 1 //将局部变量0(即a)的值自增1。这意味着将变量a的值增加1。
9: iinc 1, 15 // 将局部变量1(即b)的值增加15。这意味着将变量b的值增加15。
12: iload_0 //将局部变量0(即a)的值加载到操作数栈顶。即将变量a的值压入//栈顶。
13: iload_1 //将局部变量1(即b)的值加载到操作数栈顶。即将变量b的值压入//栈顶。
14: iadd //对栈顶的两个整数值进行相加。将栈顶的两个值相加,并将结果放入栈顶,然后将a,b的值从操作栈中弹出
15: iconst_2 //将常量值2压入操作数栈。这表示将整数值2放入栈顶。
16: idiv // 对栈顶的两个整数值进行整数除法运算。将栈顶的整数除以次栈顶的整数,并将结果放入栈顶。 //: 从当前方法返回栈顶的整数值作为结果
17: ireturn
}
以及贴下学习链接
个人认为看过的里面最说人话的
友情感谢:两张图让你快速读懂JVM字节码指令 - 知乎 (zhihu.com)