我目前正在开发一个项目,要求我以编程方式将.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目录中。但该文件是一个空文件。
答案 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分钟后,这里可以从哪里开始:
特别是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);