i++ 反编译码

1、特点:

  1. 操作数栈,主要用于保存计算过程中的结果,同时作为集计算过程中变量临时的存储空间

  2. 操作数栈就是JVM执行引擎的一个工作区,当方法执行开始,一个新栈帧也会随之被创建,这个方法的操作数栈是空的。

  3. 每一个操作数栈都会拥有一个明确的栈深入用于存储数据值

  4. 我们说是java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是操作数栈。

  5. 如果被调用的方法带有返回值的话,其返回值将被压入当前栈帧操作数栈中

2、执行过程

反编译字节码文件

1、第一步:

  • bipush:将值压入操作数栈的操作。

  • istore_1:将栈顶指针指向的值放入局部变量表中索引为1的地方。

  • iload_1:将局部变量表中索引为1的值压入操作数栈中

  • iadd:让操作数栈中数字纷纷出栈,通过 执行引擎进行add操作。

PC寄存器中存储第0的指令地址,然后对应指令地址执行对应的操作指令bipush。将15压入操作数栈,此时栈顶指针指向15。
PC寄存中存入2的地址指令,15出栈,进入局部变量表中索引为1的位置(istore_1)(索引为0的位置存放的this)

2、第二部

8压入操作数栈(bipush),然后出栈进入局部变量表索引为2的位置(istore_2)

3、第三步

iload_1 和 iload_2 分别将局部变量表中的15和8放入操作数栈中。

4、第四步

将操作数栈中的15和8分别出栈,进行iadd操作,相加后的值再次压入到操作数栈中。然后执行istore_3.。将23出栈,放入局部变量表索引为3的地方。

3、i = i++值不变

i = 0;
i = i++;

反编译:

数字的:1,2,..6,7:是pc寄存器存储的指令地址,指示执行对应的操作指令

0:iconst_0;   // 将int类型的0 入栈
1:istore_1;   // 将栈顶0弹出,保存到局部变量 index索引值为1 的位置。
2:iload_1;    // 将局部变量表 index 1位置的值的副本入栈,(此时:局部变量表 index为1的值是0,操作数栈顶的值是0)
3:iinc_1,1;   // iinc是对int类型的值进行自增操作(局部变量表index 1的值执行了自增变为了1,单操作数栈中的值仍然为0)
6:istore_1;   // 操作数栈顶的值弹出(值为 0),放到局部变量表index 1的位置(旧值:1,新值:0),覆盖到上一步的局部变量表中。
7:iload_1;    // 将局部变量表index 1的位置的副本入栈

转发连接:https://blog.csdn.net/weixin_44717746/article/details/107774945

原文地址:https://www.cnblogs.com/zhouyongyin/p/13540361.html