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

标签 java decompiler

我目前正在从事一个项目,该项目要求我以编程方式将 .class 文件反编译为 java 文件。 IE。我有一个程序应该读取一个类文件并反编译它,并将生成的 java 源代码写入一个文件。请帮助我完成它。
编辑: 我对反编译器的世界完全陌生。我已经使用了一些 API,但我不知 Prop 体如何使用以及使用哪一个。任何形式的帮助都会非常感激
编辑:
我尝试使用:

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
}

关于java - 以编程方式反编译 .class 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23217891/

相关文章:

intellij-idea - Java源代码被Intellij中的反编译文件取代

java - ArrayList 作为对象属性不保存值

java - 使用计算机视觉进行 Android 数独求解器

java - CSSSelector 无法定位带有名称参数的元素

java - 我们如何解释静态代码分析中的异常抛出?

c# - 如何使用 C# 安全连接到 MySQL,反编译时不显示任何信息

Java,如何使用 Jackson ObjectMapper 反序列化双重嵌套 json 列表

java - eclipse 中的 Tomcat 服务器不支持 TLS/SSL

c# - dotnet dll反编译并修改代码

java - Fernflower 和 IntelliJ IDEA 的 java 反编译器