【发布时间】:2017-04-29 14:02:04
【问题描述】:
我有一个项目,其中包含一个文件夹“输入”,其中包含一些 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文件,则需要编译它们以获取字节码。 -
使用
JavaCompilerAPI,在运行时可以从.java文件创建字节码。有关示例,请参见 this question and answers(问题涉及“字符串”,但答案显示使用JavaCompilerAPI 也可应用于.java文件)
标签: java bytecode javaagents bcel