与Java 5一起使用的Java反编译器(处理其他新东西中的枚举)

时间:2011-10-24 11:25:11

标签: java enums decompiling

我知道这个问题已被问过gzillions次,但我特意在一个能够正确处理枚举的反编译器之后(因为我反编译的jar使用了很多枚举)。我测试过JAD和JD-GUI都没有。

有人可以推荐一个反编译器(理想情况下,它可以在Linux下运行,并且可以轻松处理整个jar而不需要我编写shell脚本)吗?

编辑: 具体来说,我遇到的问题包括:

switch(myEnum) {
case A: ...
case B: ...
}

它们被反编译(对于JAD和JD-GUI),如:

switch ($SWITCH_TABLE$com$MyType()[myEnum.ordinal()]) {
case 1:
case 2:
}

其中$SWITCH_TABLE$com$MyType()根本没有声明或者没有编译。

2 个答案:

答案 0 :(得分:2)

无法正确反编译enum-switch。 java-classfile在编译后不知道enum-Typ,因此您的反编译器无法根据需要对其进行反编译。

枚举 - 类型都是java.lang.Enum的子类型,每个枚举常量都有一个在switch语句中使用的序数。编译器对该int值进行了切换,对枚举类型的切换就是简单的语法糖。如果您尝试打开null - 枚举,您将获得NPE。

答案 1 :(得分:2)

我发现研究项目CFR的产品特别好地处理了Enums。

目前JD-GUI和JAD的表现并不比发布OP的问题好,而CFR版本0.43产生正确的,可编译的来源,即使是在提供混淆的类时也是如此。