0

我有一个项目,其中包含一个文件夹“输入”,其中包含一些 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

有人有什么想法吗?

4

1 回答 1

2

“字节码”是指已编译的类文件。询问如何从.java文件中获取字节码是没有意义的,因为没有要获取的字节码。您需要使用javac、Eclipse 或类似工具编译它们。然后,您可以以.class任何您想要的方式读取生成的文件。

编辑:要将类文件转换为人类可读的形式,您需要一个反汇编程序。JDK 中包含一个名为的受限反汇编javap程序,因此最简单的方法就是使用它。或者,您可以使用Krakatau 反汇编程序,它支持比 javap 更高级的功能。

于 2017-04-29T15:09:03.563 回答