使用Java5的Java反编译器(处理枚举和其他新事物)
我知道这个问题已经被问了无数次了,但我特别想要一个能够正确处理枚举的反编译器(因为我正在反编译的jar大量使用枚举)。我测试了JAD和JD-GUI都没有 有人能推荐一个反编译器吗(理想情况下,它可以在Linux下工作,并且可以轻松地处理整个jar,而不需要我编写shell脚本) 编辑: 具体而言,我对以下结构存在问题:使用Java5的Java反编译器(处理枚举和其他新事物),java,enums,decompiling,Java,Enums,Decompiling,我知道这个问题已经被问了无数次了,但我特别想要一个能够正确处理枚举的反编译器(因为我正在反编译的jar大量使用枚举)。我测试了JAD和JD-GUI都没有 有人能推荐一个反编译器吗(理想情况下,它可以在Linux下工作,并且可以轻松地处理整个jar,而不需要我编写shell脚本) 编辑: 具体而言,我对以下结构存在问题: switch(myEnum) { case A: ... case B: ... } 它们被反编译(对于JAD和JD-GUI)如下: switch ($SWITCH_TABLE
switch(myEnum) {
case A: ...
case B: ...
}
它们被反编译(对于JAD和JD-GUI)如下:
switch ($SWITCH_TABLE$com$MyType()[myEnum.ordinal()]) {
case 1:
case 2:
}
其中,
$SWITCH\u TABLE$com$MyType()
未声明或未编译。无法正确反编译枚举开关。java类文件在编译后不知道枚举类型,因此您的反编译器无法按照您的喜好对其进行反编译
枚举类型都是
java.lang.Enum
的子类型,每个枚举常量都有一个序号,在switch语句中使用。编译器对该int值进行切换,对枚举类型的切换就是语法糖。如果你试着打开一个null
-enum,你会得到一个NPE。我发现一个研究项目的产品处理enum特别好
此时,JD-GUI和JAD的性能并不比OP的问题发布时好,而CFR版本0.43生成了正确的可编译源代码,即使在提供了模糊类的情况下也是如此。根据我上面链接的问题,可能的重复为Java 5提供了最好的版本。如果这对您不起作用,请告诉我们它是如何起作用的。我不知道JD-GUI的情况,但我们使用的是JD Eclipse,它使用JD-GUI所使用的较旧版本的JD Core,并且它还可以处理枚举。Java 5的任何扩展imagination@Grzenio:请定义“未工作”。你能定义一个它如何不起作用的例子吗?除非你能告诉我们什么对你不起作用,否则这个问题并不比其他几百个问题好。我想这取决于反编译器有多聪明。如果它能够找到枚举的声明,那么它应该能够将序号映射回名称。如果我反编译打开枚举的$1版本a类文件,我会得到所有序号以及枚举常量的列表。这将是可能的反编译-它只需要编码。不幸的是,JDJava反编译器似乎不是开源的:-(而且JAD太老了,不费吹灰之力就无法在其他方面跟上进度。