5

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

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

我需要这样的DecompileTool,有人知道吗?谢谢

4

4 回答 4

3

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

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

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

  • 为了获取字节码,您需要重做类加载器在从类路径中找到“.class”文件时所做的事情。

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

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

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

于 2012-07-02T03:47:14.513 回答
2

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

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

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

于 2012-07-02T03:40:56.150 回答
0

试试Cavaj Java Decomplier,它可能对你有用。如果你对此不满意,试试JadClipse和 Eclipse IDE。

于 2012-07-02T04:15:29.250 回答
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);  
}  

.jad2)现在编译的类在类文件所在的路径中被转换为扩展名(源代码)

3) 现在您可以按JDK6 的类读取该.jad文件。Scanner喜欢

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

        while(scanner.hasNext()){
            System.out.println(scanner.next());
        }
于 2012-07-02T04:16:09.697 回答