【问题标题】:Compiler asm bytecode编译器 asm 字节码
【发布时间】:2013-06-09 01:27:54
【问题描述】:

我想看看这段代码的字节码

if (3 < 5) {

}

使用 javap -c 。但由于某种原因,它没有显示步骤。例如 int a;工作正常。

任何想法如何在字节码中看到这一点?

【问题讨论】:

  • 该块中没有任何内容,因此编译器可能只是删除了那段代码。尝试让块内实际发生一些事情(一些可预测的事情,因此您可以将其从字节码中删除)。
  • 不仅如此,条件始终为真,您也不太可能看到测试(至少使用 Oracle 的 Java 7 编译器,测试不会转为字节码)。

标签: java assembly compiler-construction jvm bytecode


【解决方案1】:

编译器并不像你想象的那么笨。您尝试在字节码中看到的块是:

  1. 永远正确

这意味着编译器会将其完全排除在字节码之外。

尝试以下方法:

    int a = 3;
    if(a < 5)
    {
        a = 3 + 5;
    }

你会在你的字节码中得到以下汇编指令:

   0: iconst_3      
   1: istore_1      
   2: iload_1       
   3: iconst_5      
   4: if_icmpge     10
   7: bipush        8
   9: istore_1      
  10: return 

【讨论】:

    【解决方案2】:

    javap -c :打印每个指定类中每个方法的 Java 虚拟机指令。该选项反汇编 所有方法,包括私有方法。

    由于您的块中没有任何内容并且条件始终为真,您可能看不到字节码。

    【讨论】:

    • 您的报价与问题无关。
    【解决方案3】:

    如果您想知道,如果没有完全优化,将生成的字节码类似于

    iconst_3
    iconst_5
    if_icmpge (offset)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多