如何动态反编译内存中的类对象?

时间:2012-07-02 03:34:18

标签: java decompiler

我正在制作一个工具来动态显示运行java类的源代码。我需要一个工具来帮助我从Class ObjectString源代码动态反编译。我知道一些反编译工具,比如Jad,DJ反编译器可以反编译.class文件,但我希望有一个工具可以:

Class<?> c = ..; // get from runtime environment
String sourcecode = **DecompileTool**.decompileClassObject(c);
return sourcecode;

我需要这样一个 DecompileTool ,有谁知道?感谢

4 个答案:

答案 0 :(得分:2)

认为任何这些反编译器都支持这种丑陋的界面。

首先,大多数反编译器将以与实际编译器类似的格式表示任何代码,因此,抽象语法树。如果你很幸运,并且反编译器 有一个接口,它可能就是这种类型。回传原始String不太可能令人满意,因为编写反编译器的人如何知道您希望如何格式化代码(反编译中最大的挑战之一就是将结果呈现给用户! )。

相反,你应该做的是写一个小包装器,这样做是正确的:动态生成需要反编译的文件,通过反编译器发送它们,并将结果提取到一个字符串(你如果你做了聪明的分叉和管道等,可以立即获得...,但实际上你可能只想格式化反编译器的输出文件..)

答案 1 :(得分:2)

我不知道任何可以像这样使用的反编译器。

实际上,在一般情况下,不可能实现一个像这样工作的反编译器:

  • 从运行时获取的Class<?>对象无法提供任何获取字节码的方法。

  • 为了掌握字节码,您需要重做类加载器在从类路径中找到“.class”文件时所执行的操作。

  • 我认为没有办法找出正在使用的类加载器...如果包含动态实例化类加载器的可能性。 (此类类加载器在(例如)Web容器中是常规做法。)

  • 在一般情况下,类加载器将以您无法重现的方式执行此操作...无需逆向工程并将相同的逻辑硬编码到您的反编译器适配器代码中。

此外,在运行中执行此操作可能毫无意义,因为反编译器很可能会生成无法编译的源代码。

答案 2 :(得分:0)

尝试Cavaj Java Decomplier,它可能对您有用。如果您对此不满意,请尝试使用eclipse IDE JadClipse

答案 3 :(得分:0)

您可以执行以下操作步骤

1)您可以使用可用的反编译器来反编译代码,如

Process p = Runtime.getRuntime().exec("jad /location/CompilesClass.class");
BufferedReader in = new BufferedReader(  
    new InputStreamReader(p.getInputStream()));  
String line = null;  
while ((line = in.readLine()) != null) {  
    System.out.println(line);  
}  

2)现在Compiled类在类文件所在的路径中转换为.jad扩展名(源代码)

3)现在,您可以通过.jad JDK6类读取Scanner文件。像

        Scanner scanner = new Scanner(new File("locationOfJADFIle")).useDelimiter("\n");

        while(scanner.hasNext()){
            System.out.println(scanner.next());
        }