[英]Get Bytecode from a not loaded java class
我有一个项目,其中的“输入”文件夹包含一些Java文件(例如test.java)。该文件夹不是源根目录,没错。 我只想使用我的程序分析输入文件夹中的文件。 一个目标是从输入文件夹中的文件中获取字节码并将其保存在字符串中。 我读了很多关于从类(java代理,bcel)中获取字节码的信息,但是我不清楚如何开始。 您对我有什么想法和提示吗?
编辑:我编译了文件并将其保存到字节数组中。 我使用了有人提到的javaassist库。 我的代码现在是:
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Test");
byte[] b = cc.toBytecode();
System.out.println(Arrays.toString(b));
结果,我得到:
[-54, -2, -70, -66, 0, 0, 0, 52, 0, 93, 10, 0, 25, 0, 52, 8, 0, 53, 7, 0,...,115]
我如何从字节数组中获取字节码的“人类可读”形式,例如:
iconst_0 // 03
istore_0 // 3b
iinc 0, 1 // 84 00 01
iload_0 // 1a
iconst_2 // 05
imul // 68
istore_0 // 3b
goto -7 // a7 ff f9
有人知道吗?
“字节码”是指编译的类文件。 询问如何从.java
文件中获取字节码是没有意义的,因为没有字节码可以获取。 您需要使用javac
,Eclipse或类似的语言对其进行javac
。 然后,您可以按任何方式读取生成的.class
文件。
编辑:要将类文件转换为可读格式,您需要一个反汇编程序。 JDK中包含一个称为javap
的有限反汇编程序,因此最简单的方法就是使用它。 另外,您可以使用Krakatau反汇编程序 ,它比javap支持更多高级功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.