从未加载的java类中获取字节码

时间:2017-04-29 14:02:04

标签: java bytecode javaagents bcel

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

任何人都有一些想法?

1 个答案:

答案 0 :(得分:2)

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

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