当我要求他显示我编译的类(我选择的方法)时,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
。
我是对的吗?
答案 0 :(得分:2)
这些都不是更原始的。只有两种不同的方式来呈现完全相同的信息。
答案 1 :(得分:0)
看起来Javap和Groovy都做了一些糖,但是以不同的方式,所以你不能说一个比另一个更“原始”。例如,Groovy显示Javap糖的原始方法描述符(II)I
,而Javap显示堆栈和本地计数,而Groovy则不显示。
话虽如此,但两者都不是特别“原始”。 Javap旨在帮助Java调试,所以它试图隐藏或重写一些东西,以使输出更像Java。它的目的不是处理异常或恶意构造的类文件。
如果您想要最“原始”的反汇编输出,最好的选择是Krakatau disassembler。 Krakatau是唯一可以表示任意类文件中每个小细节的反汇编程序,包括非java和恶意构造的类文件。