基本信息
字节码文件的组成部分-Magic魔术
- 文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件内容.
- 软件使用文件头几个字节去校验文件的类型,如果软件不支持这种类型就会出错
案例
运行的jdk版本不一致
解决方法
- 升级JDK版本(容易引发其他兼容性问题,并需要大量测试)
- 更换第三方依赖的,以满足JDK版本的要求
常量池
常量池的左右:避免相同内容重复定义,节省空间
常量池的符号引用
- 常量池的的数据都有一个编号,编号从1开始.在字段或字节码指令中通过编号可以快速的找到数据
- 字节码指令中通过编号引用到常量池的过程称为符号引用
例题
- 先在程序中运行一下
可以看到结果为0
我们这时可以打开字节码文件去从字节码文件中分析一下这段代码是怎么执行的
可以看到方法中一共分了14个命令去执行这段代码
下面使用一个例子进行分析用于学习常见命令iconst,istore,iload,iadd,Iconst
iconst_0 的作用: 将0放在操作数栈中
istore_1的作用:将操作数栈中的0放在数组下标为1的为位置(先在操作数栈中删除0,之后在数组下标1处添加值)
iload_1:将数组下标为1的元素复制一份放入操作数栈中
Iconst_1
iadd
istore_2:将栈中的1放入在局部变脸数组中下标为2的位置
Return 方法结束返回
下面回到刚才的题目
首先先在操作数栈中放入0
在将0放入数组下标1的数组中
在将数组中的数加载到操作数栈中
i++官方文档解释 为在数组中直接增加1
在数组中直接增加1
最后将栈中的数放回数组 数组中的值又变为0
总结