我遇到了一个问题,我认为我没有使用正确的术语来搜索解决方案。
所以,我有text(String)形式的字节码,如下所示:
public class HelloWorld {
public HelloWorld();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iinc 1, 1
5: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
8: new #3 // class java/lang/StringBuilder
11: dup
12: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
15: ldc #5 // String Hello World
17: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: iload_1
21: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
24: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
27: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: return
}
现在我需要将其编译为.class文件。
我查看了ASM,Jasmin和其他汇编工具,但无法找到合适的解决方案。我从这些工具中理解的是,您使用特定的指令集语言编写程序,并将其转换为二进制文件。但我正在寻找的是使用JVM自己的常规指令集。
我感谢任何帮助。
答案 0 :(得分:2)
看起来你有javap
输出。不幸的是,javap
只是一个快速的调试工具,输出的设计不能被重新组装成类文件。
如果您希望能够反汇编和重新组合类文件,我强烈建议使用Krakatau,它完全支持类文件规范以及一些未记录的功能,并且可以将任意类文件从二进制文件往返文本并返回。< / p>
如果您想以编程方式执行此操作并且不需要高级功能,我建议使用ASM,而不是CLI工具。
答案 1 :(得分:0)
看,类文件包含一个字节码。因此,当您编写Java源程序 Hello.java 并使用 javac Hello.java 对其进行编译时。它为您提供了一个类文件,即 Hello.class 。该类文件包含一个Java字节码,您可以通过以下命令查看它: javap -c Hello.class
因此,您发送的上述代码已经是javac编译器编译的Bytecode,并且它是一个类文件。