选择并测试java反编译器

use*_*011 41 java decompiler

现在我正在尝试找到最好的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");}
}
}
Run Code Online (Sandbox Code Playgroud)

我得到了以下结果:

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");
      }

   }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我看到反编译器的最佳结果:http://java.decompiler.free.fr/

为了测试,我编写了非常简单的代码.你怎么看,用什么代码来测试反编译器?也许这个想法比try {} catch(){} finally {}更好?

Jus*_*ick 25

您用于测试的代码应该测试用于编译目标类的JDK中可用的功能.例如,如果您知道目标是用Java 1.5编写的,那么可以合理地假设代码可能包含泛型,因此您需要确保所选的反编译器正确处理它们.根据我的经验,免费提供的反编译器在1-2版本支持的功能方面往往落后于JDK版本.

根据个人的反复试验,JD总体上做得最好.但是,如果您正在反编译以1.3或更低版本编写的代码,我还建议您尝试使用JODE.

编辑,5年后:

CFR,ProcyonFernflower在这个领域引领潮流.


Ana*_*ant 8

我已经使用http://java.decompiler.free.fr/很长一段时间了,发现它是最好的一个.特别是我用它来反编译第三方jar,我也可以用它来修改源代码.

它易于使用,用户界面也整洁干净.

更新:http ://java.decompiler.free.fr/上不再提供Java Decompiler .它有新的链接http://jd.benow.ca/可以从哪里下载.


Ste*_*n C 6

它看起来像fernflowerJD的Java反编译器是生产反编译的代码是一样好,有可能这个特殊的测试用例.另外两个人做得不好,IMO.

你怎么看,用什么代码来测试反编译器?

  1. 使用所有可用的构造编写更复杂的代码.
  2. 尝试一些真正的代码.
  3. 尝试一些已被混淆的真实代码.

在尝试从源代码编译的代码时,尝试使用不同的"-g"选项,并使用不同的Java编译器.


Sti*_*ver 6

如果您期望获得任何有意义的结果,那么您真的应该使用更多非平凡的代码进行测试.Fernflower的创建旨在处理极不寻常和混淆的字节码.因此,反编译这样简单的片段并不是什么大问题.顺便说一句,如果你有兴趣测试Fernflower的独立版本,请给我发一个注意:fernflower(dot)decompiler(at)gmail(dot)com.版本0.8.4现在处于半公开测试阶段(但尚未在网站上提供).


vor*_*ger 5

http://www.reversed-java.com/fernflower/,请参阅我在github.com/vorburger/ScratchApplet上的比较