一、字节码文件的组成部分
- 操作数栈是临时存放数据的地方
- 局部变量表是存放方法中的局部变量的位置
观察如下代码的字节码文件
int i = 0; int j = i + 1;
具体的java源代码:
public static void main(String[] args) { int i = 0; int j = i + 1; }
要想看到java的字节码文件的内容,可以通过jclasslib这个工具来看,运行以上代码,然后通过jclasslib可以看到在这个方法中变量的存放位置,其中,局部变量表数组的0索引位置存放的是main方法的参数 args ,1索引位置存放的是第一个变量 i ,2索引存放的是第二个变量 j ,可以看出,定义在方法中的变量,方法的参数也将作为这个方法的变量存入局部变量表中,定义在方法内的变量会按定义的先后顺序依次存入局部变量表中。
接下来解析这段代码的字节码文件:
- iconst_0:将常量0放入到操作数栈中
- istore_1:将操作数栈中的值取出放入局部变量表索引为1的位置
- iload_1:将局部变量表索引为1的位置的值复制一份放入到操作数栈中
- iconst_1:将常量1放入到操作数栈中
- iadd:将操作数栈中最上面的两个值相加,并把结果存放在栈中
- istore_2:将操作数栈中的值取出放入局部变量表索引为2的位置
- return:方法结束,返回
1.1 iconst_0
1.2 istore_1
1.3 iload_1
1.4 iconst_1
1.5 iadd
1.6 istore_2
1.7 return
二、执行i++ 操作
- 源代码:
public static void main(String[] args) { int i = 0; i++; }
- 字节码:
iconst_0:将常量0放入操作数栈中
istore_1:将操作数栈中的值取出放入索引为1的局部变量表中
iinc 1 by 1:在局部变量表索引为1的位置增加1
return:方法结束,返回
2.1 iconst_0
2.2 istore_1
2.3 iinc 1 by 1
根据JVM规范,iinc就是通过一个常量递增局部变量
2.4 return
三、字节码常用工具:javap -v命令
javap是JDK自带的反编译工具,可以通过控制台查看字节码文件的内容。
适合在服务器上查看字节码文件内容。
直接输入javap查看所有参数。
输入javap-v字节码文件名称查看具体的字节码信息。(如果jar包需要先使用jar-vf命令解压)