原文
public class ClassIntrucation {public static void main(String[] args) {int i = 10;int j = i;j++;++j;}
}
查看字节码文件命令
javap -c 字节码文件
例如:
javap -c ClassIntrucation
结果
public class ClassIntrucation {public ClassIntrucation();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: bipush 102: istore_13: iload_14: istore_25: iinc 2, 18: iinc 2, 111: return
}
解读
第一个方法:
这是类的构造方法,第一个先执行类的构造方法。具体内容不过多介绍。
第二个方法:
这是main 方法,执行代码逻辑如下:
bipush 10 将字面量数字 10 压入操作数栈中。
istore_1 将操作数栈中的值弹栈放入局部变量表中的槽位1.
iload_1 将局部变量表中槽位1的值复制一份加载(压栈)到操作栈中。
istore_2 将操作数栈中的值弹栈放入局部变量表中的槽位2.
iinc 2,1 将局部变量表中槽位2的值压栈到操作数栈中,值加一,弹栈到槽位2。
iinc 2,1 将局部变量表中槽位2的值压栈到操作数栈中,值加一,弹栈到槽位2。
解读 i++ 和 ++i
public class ClassIntrucation {public static void main(String[] args) {int i = 10;int j = i++;int k = ++i;}
}
字节码解读
public class ClassIntrucation {public ClassIntrucation();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: bipush 102: istore_13: iload_14: iinc 1, 17: istore_28: iinc 1, 111: iload_112: istore_313: return
}
槽位1 : i 槽位2: j 槽位3: k
1. 将槽位1的值(10) 复制一份 压栈到操作数栈中。
【10】
2. 将槽位1 的值 取出压栈 到操作数栈中 ,值加一,弹栈到槽位1。
【10,10 + 1】-->【10】 i++; i = 11;
3. 操作数栈弹栈到槽位2。
【】 j = 10;
1. 将槽位1 的值 取出压栈 到操作数栈中 ,值加一,弹栈到槽位1。
【11 + 1】 --> 【】 ++i; i = 12;
2. 将槽位1 的值 (12)复制一份到操作数栈中。
【12】
3. 操作数栈弹栈到槽位3.
【】 k = 12;