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

Java 以编程方式反编译.class文件,java,decompiler,Java,Decompiler,我目前正在从事一个项目,该项目要求我以编程方式将.class文件反编译为java文件。也就是说,我有一个程序,应该读取类文件并对其进行反编译,然后将生成的java源代码写入一个文件中。请帮我做这件事。 编辑: 我对反编译器的世界是完全陌生的。我已经浏览了一些API,但我不知道如何使用以及使用哪一个。任何形式的帮助都将非常可观 编辑: 我尝试使用: import com.strobel.decompiler.*; import java.io.*; public class JavaDecode

我目前正在从事一个项目,该项目要求我以编程方式将.class文件反编译为java文件。也就是说,我有一个程序,应该读取类文件并对其进行反编译,然后将生成的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”的文件。但该文件是一个空文件

在Google上搜索5分钟后,这里是开始的地方:

  • 反编译是一项复杂的任务(就像编译一样)。因此,您可能需要一个用于此taks的外部库。与任何库一样,有些是好的,有些不是,您必须评估哪个库适合您的需要。一些库是(谷歌上的第一个热门) 和(对Maven的第一次打击)
  • 尝试评估您想要使用的库(您的需求是什么?库的功能是什么?)。然后尝试使用图书馆。如果您在某个库中遇到任何问题,请随时询问
特别是看起来非常简单(来自GitHub上的自述):

List class=Arrays.asList(“foo.bar.Baz1”、“foo.bar.Baz2”)
列表类路径=。。。
File outputDir=新文件(“输出”);
喀拉喀托图书馆喀拉喀托=新喀拉喀托图书馆()。
反编译(类路径,类,outputDir);
包括一个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
文件路径传递给
反编译()
方法,而不是传递类名

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

我们几乎没有足够的信息来帮助您解决这个问题。你试过什么节目?你是怎么尝试的?你期望得到什么结果?你得到了什么结果?这绝非易事——你应该找到一个现有的开源反编译器并使用代码。我已经使用了你提供的代码。我使用的确切代码在这个问题的编辑部分。但代码只是在指定目录中生成一个空文件。任何帮助都是值得的。你写的代码不一样。我的代码在
try
resource语句中声明了
stream
writer
,这意味着调用
close()
,刷新缓冲区。尝试手动关闭您的编写器和流。当我尝试完全按照您提供的代码使用代码时,我得到一个错误:在-source 1.6中不支持Try with resources(使用-source 7或更高版本以启用Try with resources)。我编辑了我的答案,向您展示了如何手动关闭资源。这对我有很大帮助。谢谢
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
}