以编程方式反编译.class文件

时间:2014-04-22 11:16:13

标签: java decompiler

我目前正在开发一个项目,要求我以编程方式将.class文件反编译为java文件。 I.E.我有一个应该读取类文件并对其进行反编译的程序,并将生成的java源代码写入文件中。请帮帮我 编辑: 我对反编译器世界全新。我已经完成了一些API,但我并不确切知道如何使用以及使用哪种API。任何形式的帮助都会非常明显 编辑:
我尝试使用:

import com.strobel.decompiler.*;
import java.io.*;
public class JavaDecode {
public static void main(String[] args)throws Exception {
decompileee();
}

private static void decompileee()throws Exception
{
final DecompilerSettings settings = DecompilerSettings.javaDefaults();
final FileOutputStream stream = new FileOutputStream("C:/jp/decompiled.java");
final OutputStreamWriter writer = new OutputStreamWriter(stream); 
Decompiler.decompile("C:/jp/X.class",
new PlainTextOutput(writer),
settings
);
System.out.println("Success");
}
}

但是上面的代码只是简单地创建了一个名为" decompiled.java"在scpecified目录中。但该文件是一个空文件。

2 个答案:

答案 0 :(得分:3)

Procyon包含一个Java反编译器框架。它是用Java编写的,可以称为库。目前还没有太多文档,但我是作者,如果遇到麻烦我可以帮助你 - 只需在BitBucket上与我联系。

如何反编译java.lang.String

的简单示例
final DecompilerSettings settings = DecompilerSettings.javaDefaults();

try (final FileOutputStream stream = new FileOutputStream("path/to/file");
     final OutputStreamWriter writer = new OutputStreamWriter(stream)) {

    Decompiler.decompile(
        "java.lang.String",
        new PlainTextOutput(writer),
        settings
    );
}
catch (final IOException e) {
    // handle error
}

您还可以将.class文件路径传递给decompile()方法而不是类名。

如果您不使用Java 7,请确保手动刷新/关闭I / O资源,例如:

try {
    final FileOutputStream stream = new FileOutputStream("path/to/file");

    try {
        final OutputStreamWriter writer = new OutputStreamWriter(stream);

        try {
            Decompiler.decompile(
                "java.lang.String",
                new PlainTextOutput(writer),
                DecompilerSettings.javaDefaults()
            );
        }
        finally {
            writer.close();
        }
    }
    finally {
        stream.close();
    }
}
catch (final IOException e) {
    // handle error
}

答案 1 :(得分:0)

在谷歌上搜索5分钟后,这里可以从哪里开始:

  • 反编译是一项复杂的任务(就像编译一样)。因此,您可能需要一个外部库来支持此项目。与任何图书馆一样,有些是好的,有些则不是,您必须评估哪个库符合您的需求。有些图书馆是http://jd.benow.ca/(Google上的第一个图书馆) 和https://github.com/alexkasko/krakatau-java(对Maven的第一次打击)。
  • 尝试评估您要使用的库(您的要求是什么?库的功能有哪些?)。然后尝试使用该库。如果您遇到某个库的任何问题,请随时提问。

特别是https://github.com/alexkasko/krakatau-java似乎很容易(来自GitHub上的README):

List<String> classes = Arrays.asList("foo.bar.Baz1", "foo.bar.Baz2")
List<File> classpath = ...
File outputDir = new File("out");
KrakatauLibrary krakatau = new KrakatauLibrary().
krakatau.decompile(classpath, classes, outputDir);