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



我目前正在处理一个项目,该项目要求我以编程方式将.class文件反编译为java文件。I.E.我有一个程序,它应该读取一个类文件并对其进行反编译,然后将生成的java源代码写入一个文件中。请帮我做这件事。
编辑:我对反编译器的世界完全陌生。我已经浏览了一些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"的文件。但该文件是一个空文件。

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()方法,而不是类名。

如果您不使用Java7,请确保手动刷新/关闭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
}

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

  • 反编译是一项复杂的任务(就像编译一样)。所以你可能需要一个外部库来完成这个任务。与任何库一样,有些库是好的,有些库不是,你必须评估哪个库符合你的需求。一些库http://jd.benow.ca/(谷歌第一次点击)和https://github.com/alexkasko/krakatau-java(Maven的第一支安打)
  • 试着评估你想使用哪个库(你的要求是什么?库的功能是什么?)。然后试着使用图书馆。如果你在某个图书馆遇到任何问题,请随时询问

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

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

最新更新