3

这是javap当我让他显示我的编译类时生成的代码(我选择了方法)

int multiply(int, int);
  flags:
  Code:
    stack=2, locals=3, args_size=3
       0: iload_1
       1: iload_2
       2: imul
       3: ireturn
    LineNumberTable:
      line 2: 0
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
             0       4     0  this   LMyClass;
             0       4     1     a   I
             0       4     2     b   I

这是代码,通过groovyConsole(相同的方法)显示

public multiply(II)I
   L0
    LINENUMBER 4 L0
    ILOAD 1
    ILOAD 2
    IMUL
    IRETURN
   L1
    LDC 0
    IRETURN
    LOCALVARIABLE this LMyClass; L0 L1 0
    LOCALVARIABLE a I L0 L1 1
    LOCALVARIABLE b I L0 L1 2
    MAXSTACK = 2
    MAXLOCALS = 3

但是哪个字节码更多raw?据我了解,javap添加了一些风格,所以第二个例子应该更真实bytecode。我对吗?

4

2 回答 2

2

这些都不是更原始的。只有两种不同的方式可以呈现完全相同的信息。

于 2016-03-22T10:06:25.580 回答
0

看起来 Javap 和 Groovy 都做了一些加糖,但方式不同,所以你不能说一个比另一个更“原始”。例如,Groovy 显示 Javap 糖化的原始方法描述符(II)I,而 Javap 显示堆栈和本地计数,而 Groovy 不显示。

话虽如此,两者都不是特别“原始”。Javap 旨在帮助进行 Java 调试,因此它会尝试隐藏或重写许多内容,以使输出更像 Java。它根本不是为了处理异常或恶意构造的类文件而设计的。

如果你想要最“原始”的反汇编输出,你最好的选择是Krakatau disassembler。Krakatau 是唯一可以表示任意类文件中每个小细节的反汇编程序,包括非 java 和恶意构建的类文件。

于 2016-03-22T13:20:35.550 回答