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

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

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

但是上面的代码只是在scpecified目录中创建了一个名为“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()方法而不是类名。

如果您不使用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 } 

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

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

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

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