现在我正在尝试找到最好的java反编译器,我找到了这些:
使用这些反编译器,我处理这个类的字节代码:
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/
为了测试,我编写了非常简单的代码。你怎么看,用什么代码来测试反编译器?也许这个想法比try {} catch(){} finally {}?
更好答案 0 :(得分:25)
用于测试的代码应该测试用于编译目标类的JDK中可用的功能。例如,如果您知道目标是用Java 1.5编写的,那么可以合理地假设代码可能包含generics,因此您需要确保所选择的反编译器正确处理它们。根据我的经验,免费提供的反编译器在1-2版本支持的功能方面往往落后于JDK版本。
根据个人的反复试验,JD往往会做得最好。但是,如果您正在反编译以1.3或更低版本编写的代码,我还建议您尝试JODE。
编辑,5年后:
CFR,Procyon和Fernflower在此领域处于领先地位。
答案 1 :(得分:10)
答案 2 :(得分:8)
我已经使用http://java.decompiler.free.fr/很长一段时间了,发现它是最好的。特别是我用它来反编译第三方jar,我也可以用它来修改源代码。
易于使用,用户界面整洁干净。
更新:http://java.decompiler.free.fr/上不再提供Java Decompiler。它有新的链接http://jd.benow.ca/,可从中下载。
答案 3 :(得分:6)
看起来fernflower
和JD Java Decompiler生成的反编译代码与此特定测试用例一样好。另外两个人做得不好,IMO。
你怎么看,用什么代码来测试反编译器?
在尝试从源代码编译的代码时,尝试使用不同的“-g”选项,并使用不同的Java编译器。
答案 4 :(得分:6)
如果您希望获得任何有意义的结果,那么您真的应该使用更多非平凡的代码进行测试。 Fernflower的创建旨在处理极不寻常和混淆的字节码。因此,反编译这样简单的片段并不是什么大问题。顺便说一句,如果你有兴趣测试Fernflower的独立版本,请给我发一个注意:fernflower(dot)decompiler(at)gmail(dot)com。版本0.8.4现在处于半公开测试阶段(但尚未在网站上提供)。
答案 5 :(得分:5)
http://www.reversed-java.com/fernflower/,请参阅我在github.com / vorburger / ScratchApplet上的比较
答案 6 :(得分:4)
有关信息,JD支持switch(enum),switch(字符串),断言语句和for-each循环。
关于-g(javac)选项,
答案 7 :(得分:1)
好的,这是用我的手机写的,所以请耐心等待。
首先,每个java文件代码都在其各自的 .class 文件中以字节码编译。这意味着常量存储AS IS
(因此可以轻松检索字符串),并将变量分配给寄存器,然后在JVM处理类文件时将其置于堆栈程序执行中。
您的异常块未返回到您编写的原始代码的原因是因为javac编译的方式&将代码翻译成java字节码。
如果你想知道哪个反编译器工作得最好,可以用一些表达式&amp ;;写出所有java众所周知的语句(for循环,if语句,while循环)。看看最能代表原始代码的内容。
祝你好运。答案 8 :(得分:0)
自从对此主题发表任何反馈以来已经有一段时间了。但是,自从我发现它并认真对待输入后,我觉得提供更新非常重要。
我使用Java Decompiler Free取得了很好的成功。但是,最近我不小心删除了生产J2EE应用程序的相当多的代码。假设JD Free会处理它,但它根本不处理泛型。还有代码,它处理变量初始化完全错误。我最终得到的是一团糟。
可能没有任何东西可以正确地完成工作。就我而言,它只是备份,备份,备份的另一课。我需要一个可以正确处理泛型的解编译器,以便进行大规模恢复。但处理变量的一些准确性也会有所帮助。要求工具吐出原始代码太过分了。但到目前为止我所看到的将会编译但不能正常运行,除了泛型。所以我想这将是圣诞节前的一个漫长的一周!!