【问题标题】:Get Bytecode from a not loaded java class从未加载的 java 类中获取字节码
【发布时间】: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

有人有什么想法吗?

【问题讨论】:

  • 你想要实际的字节码还是人类可读的、类似汇编的形式?
  • 也许可以试试jboss-javassist.github.io/javassist/tutorial/tutorial.html,第一个例子。
  • 我想保存这两个表格。我仍然不确定我以后会使用其中哪一个,所以在开始时保存两个表单会很聪明。
  • 如果文件是.java文件,则需要编译它们以获取字节码。
  • 使用JavaCompiler API,在运行时可以从.java文件创建字节码。有关示例,请参见 this question and answers(问题涉及“字符串”,但答案显示使用 JavaCompiler API 也可应用于 .java 文件)

标签: java bytecode javaagents bcel


【解决方案1】:

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

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

【讨论】:

  • 如果我编译了我的文件并将字节码保存在一个字节数组中,我怎样才能获得人类可读的字节码形式?看我的编辑,有一个例子。
  • @vizero 我更新了我的答案。您需要一个反汇编程序,例如 javap 或 Krakatau。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2020-01-30
  • 1970-01-01
相关资源
最近更新 更多