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

从未加载的java类获取字节码,java,bytecode,javaagents,bcel,Java,Bytecode,Javaagents,Bcel,我有一个项目,其中有一个文件夹“input”,其中包含一些java文件(例如test.java)。这个文件夹不是源根目录,没错。我只想用我的程序分析输入文件夹中的文件。 一个目标是从输入文件夹中的文件中获取字节码并将其保存为字符串。 我读了很多关于从类(java代理,bcel)获取字节码的书,但我不太清楚应该如何开始。 你有什么想法和建议给我吗 编辑: 我编译了文件并将其保存到字节数组中。我使用了某个人提到的javaassist库。我的代码是: ClassPool pool = Clas

我有一个项目,其中有一个文件夹“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
有人知道吗?

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

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

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


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

您想要实际的字节码,还是它是人类可读的、类似汇编的表单?第一个例子,可以试试。我想保存这两种表单。我仍然不确定以后将使用哪一个,因此最好先保存这两种形式。如果文件是
.java
文件,则需要编译它们以获得字节码。在运行时,可以使用
JavaCompiler
API从
.java
文件创建字节码。有关一些示例,请参见(问题涉及“字符串”,但答案显示了
JavaCompiler
API的使用,该API也可以应用于
.java
文件)您想要实际的字节码还是人类可读的、类似汇编的形式?可以尝试,第一个示例。我想保存这两种形式。我仍然不确定以后将使用哪一个,因此最好先保存这两种形式。如果文件是
.java
文件,则需要编译它们以获得字节码。在运行时,可以使用
JavaCompiler
API从
.java
文件创建字节码。请参阅一些示例(问题指的是“字符串”,但答案显示了
JavaCompiler
API的使用,该API也可以应用于
.java
文件)如果我编译文件并将字节码保存在字节数组中,我如何获得人类可读的字节码形式?查看我的编辑,这里有一个例子。@vizero我更新了我的答案。你需要一个反汇编程序,比如javap或Krakatau。如果我编译了我的文件并将字节码保存在一个字节数组中,我如何才能获得人类可读的字节码形式?查看我的编辑,这里有一个例子。@vizero我更新了我的答案。您需要一个反汇编程序,比如javap或Krakatau。