我什么时候可以在从Java源代码编译的.class文件中获取pop2操作码?

时间:2018-04-25 03:12:38

标签: java bytecode decompiler

我目前正在研究Java反编译器。

我读了JVM规范,我知道pop2可以操作一个堆栈值(类别2值)或两个堆栈值(其他类别值)。

我只是想知道pop2的两个堆栈值操作何时会发生?有人能告诉我一些Java源代码,其编译结果包含两个堆栈值操作 pop2吗?

2 个答案:

答案 0 :(得分:2)

如果你弹出一个double或long,肯定会调用POP2,例如

thisMethodReturnsALong(); thisMethodReturnsADouble();

其他案件。

答案 1 :(得分:1)

根据我对Java 8中javac编译器的源代码的简要介绍,有无地点,它会向{2}类别发出POP2 - 堆栈中的1个值。如果需要弹出两个category-1值,则编译器将发出两个POP字节码。

注意事项:

  • 我只看了一个版本的OpenJDK javac编译器
  • 还有其他(非Sun / Oracle)Java字节码编译器
  • 字节码可以通过其他方式生成或修改....包括代码混淆器!

在JIT编译器出现之前,POP2的两个值弹出行为在早期Java字节码编译器中使用似乎是合理的。但是现在我们有了JIT编译器,字节码编译器中的 no point “优化”了两个POP字节码到POP2