java javap 和 groovy 字节码比较
java javap and groovy bytecode comparison
这是 javap
生成的代码,当我让他显示我编译的 class(我选择了方法)
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
。
我说得对吗?
这些都不是更原始的。完全相同的信息只有两种不同的呈现方式。
看起来 Javap 和 Groovy 都做了一些加糖,但方式不同,所以你不能真的说一个比 "Raw"其他。例如,Groovy 显示原始方法描述符 (II)I
,其中 Javap 糖,而 Javap 显示堆栈和本地计数,而 Groovy 不显示。
话虽这么说,但都不是特别 "raw"。 Javap 旨在帮助 Java 调试,因此它试图隐藏或重写许多内容以使输出更像 Java。它根本不是为处理异常或恶意构造的类文件而设计的。
如果你想要最大的"raw"反汇编输出,你最好的选择是Krakatau disassembler。 Krakatau 是唯一可以代表任意类文件中每个细节的反汇编程序,包括非java 和恶意构造的类文件。
这是 javap
生成的代码,当我让他显示我编译的 class(我选择了方法)
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
。
我说得对吗?
这些都不是更原始的。完全相同的信息只有两种不同的呈现方式。
看起来 Javap 和 Groovy 都做了一些加糖,但方式不同,所以你不能真的说一个比 "Raw"其他。例如,Groovy 显示原始方法描述符 (II)I
,其中 Javap 糖,而 Javap 显示堆栈和本地计数,而 Groovy 不显示。
话虽这么说,但都不是特别 "raw"。 Javap 旨在帮助 Java 调试,因此它试图隐藏或重写许多内容以使输出更像 Java。它根本不是为处理异常或恶意构造的类文件而设计的。
如果你想要最大的"raw"反汇编输出,你最好的选择是Krakatau disassembler。 Krakatau 是唯一可以代表任意类文件中每个细节的反汇编程序,包括非java 和恶意构造的类文件。