我目前正在处理一个项目,该项目要求我以编程方式将.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);