【JVM】字节码文件的组成二

基本信息

字节码文件的组成部分-Magic魔术

  1. 文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件内容.
  2. 软件使用文件头几个字节去校验文件的类型,如果软件不支持这种类型就会出错

案例

运行的jdk版本不一致

解决方法

  1. 升级JDK版本(容易引发其他兼容性问题,并需要大量测试)
  2. 更换第三方依赖的,以满足JDK版本的要求

常量池

常量池的左右:避免相同内容重复定义,节省空间

常量池的符号引用

  1. 常量池的的数据都有一个编号,编号从1开始.在字段或字节码指令中通过编号可以快速的找到数据
  2. 字节码指令中通过编号引用到常量池的过程称为符号引用

例题

  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

总结

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值