我正在制作一个工具来动态显示运行java类的源代码。我需要一个工具来帮助我从Class Object
到String
源代码动态反编译。我知道一些反编译工具,比如Jad,DJ反编译器可以反编译.class文件,但我希望有一个工具可以:
Class<?> c = ..; // get from runtime environment
String sourcecode = **DecompileTool**.decompileClassObject(c);
return sourcecode;
我需要这样一个 DecompileTool ,有谁知道?感谢
答案 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());
}