Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java5的Java反编译器(处理枚举和其他新事物)_Java_Enums_Decompiling - Fatal编程技术网

使用Java5的Java反编译器(处理枚举和其他新事物)

使用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

我知道这个问题已经被问了无数次了,但我特别想要一个能够正确处理枚举的反编译器(因为我正在反编译的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\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太老了,不费吹灰之力就无法在其他方面跟上进度。