select并testingjava反编译器
现在我试图find最好的Java反编译器,我发现这些:
- http://java.decompiler.free.fr/
- http://www.reversed-java.com/fernflower/
- http://dj.navexpress.com/
- http://cavaj-java-decompiler.en.softonic.com/
有了这些反编译器,我可以处理这个类的字节码:
public class ss { public static void main(String args[]) { try{ System.out.println("try"); } catch(Exception e) { System.out.println("catch"); } finally {System.out.println("finally");} } }
我得到了以下结果:
fernflower:
public class ss { public static void main(String[] var0) { try { System.out.println("try"); } catch (Exception var5) { System.out.println("catch"); } finally { System.out.println("finally"); } } }
DJ Java Decompiler:
import java.io.PrintStream; public class ss { public ss() { } public static void main(String args[]) { System.out.println("try"); System.out.println("finally"); break MISSING_BLOCK_LABEL_50; Exception exception; exception; System.out.println("catch"); System.out.println("finally"); break MISSING_BLOCK_LABEL_50; Exception exception1; exception1; System.out.println("finally"); throw exception1; } }
cavaj:
import java.io.PrintStream; public class ss { public ss() { } public static void main(String args[]) { System.out.println("try"); System.out.println("finally"); break MISSING_BLOCK_LABEL_50; Exception exception; exception; System.out.println("catch"); System.out.println("finally"); break MISSING_BLOCK_LABEL_50; Exception exception1; exception1; System.out.println("finally"); throw exception1; } }
http://java.decompiler.free.fr/ :
import java.io.PrintStream; public class ss { public static void main(String[] paramArrayOfString) { try { System.out.println("try"); } catch (Exception localException) { System.out.println("catch"); } finally { System.out.println("finally"); } } }
我在反编译器中看到最好的结果: http : //java.decompiler.free.fr/
为了testing,我写了非常简单的代码。 你怎么看,写什么代码来testing反编译器? 也许这个想法比try {} catch(){}终于更好。
您用于testing的代码应testingJDK中用于编译目标类的可用function 。 例如,如果您知道您的目标是使用Java 1.5编写的,则可以合理地假设代码可能包含generics ,因此您需要确保所选的反编译器正确处理它们。 根据我的经验,免费提供的反编译器在1-2版本支持的function方面往往落后于JDK版本。
根据个人的反复试验, JD倾向于总体上做最好的工作。 但是,如果你正在反编译1.3或更低版本的代码,我还build议你给JODE一个尝试。
茜龙有它自己的比较 。
我一直在使用http://java.decompiler.free.fr/很长一段时间,发现它是最好的。; 特别是我用它来反编译第三方的jar,我也可以修改它的源代码。
它易于使用,用户界面也干净整洁。
更新:Java反编译器在http://java.decompiler.free.fr/上不再可用。; 它有新的链接http://jd.benow.ca/从哪里可以下载。;
如果你期望得到任何有意义的结果,你真的应该testing一些不平凡的代码。 Fernflower的创build目的是处理非常不寻常和混淆的字节码。 因此,反编译这些简单的代码片段是没有什么大不了的。 顺便说一句,如果你有兴趣testingFernflower的独立版本,请在fernflower(dot)反编译器(at)gmail(dot)com下载一个注释。 版本0.8.4现在处于半公开testing阶段(但尚未在网站上提供)。
看起来fernflower
和JD Java Decompiler正在生成反编译的代码,这个代码对于这个特定的testing用例来说是可能的。 另外两个人做得不好,国际海事组织。
你怎么看,写什么代码来testing反编译器?
- 使用所有可用的结构编写更复杂的代码。
- 尝试一些真实的代码。
- 试一试真实的代码已被混淆。
在尝试从源代码编译的代码时,可以尝试不同的“-g”选项以及不同的Java编译器。
http://www.reversed-java.com/fernflower/ ,在github.com / vorburger / ScratchApplet上查看我的比较
有关信息,JD支持switch(enum),switch(string),assert语句和for-each循环。
关于-g(javac)选项,
- 如果省略行号,则JD不能重构原始指令stream程:循环types不能确定,多个分配不能重新生成,用于重新整理源代码的algorithm不能工作。
- 如果省略局部variables数据,则JD有时不能确定variables的确切范围。 这是有问题的。
好的,这是从我的手机写的,所以忍受着我。
首先,每个java文件代码都是在各自的.class文件中的字节码中编译的。 这意味着常量以AS IS
存储(因此可以轻松地检索string),并将variables分配给一个寄存器,然后在JVM处理类文件时将这些寄存器放到堆栈程序执行中。
你的exception块没有返回到你写的原始代码的原因是因为javac编译和编译成java字节码的方式。
如果你想知道哪一个反编译器最好,用一些expression式编写所有的java知名语句(for循环,if语句,while循环),看看最能代表你的原代码。
祝你好运。
已经有一段时间,因为任何反馈到这个线程。 但是,自从我发现并认真对待input,我觉得重要的是要更新。
我已经使用Java Decompiler Free获得了很好的成功。 但是,最近我不小心删除了一个生产J2EE应用程序的代码。 假定JD Free会处理它,但是它根本不处理generics。 另外还有代码处理variables初始化是完全错误的。 我最终结果是一塌糊涂。
有没有什么可以正确地工作。 就我而言,这只是备份,备份和备份的另一课。 我需要一个能够正确处理generics的解除编译器,以便进行大规模恢复。 但是处理variables的一些准确性也会有帮助。 要求一个工具吐出原始代码太多了。 但是到目前为止,我所看到的将会被编译,但是不能正常运行,而是将generics放在一边。 所以我想这将是圣诞节前的一个星期!