我知道这个问题已被问过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()
根本没有声明或者没有编译。
答案 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产生正确的,可编译的来源,即使是在提供混淆的类时也是如此。