-2

我面临一个问题,我认为我没有使用正确的术语来寻找解决方案。

所以,我有文本(字符串)形式的字节码,如下所示:

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 自己的常规指令集。

我很感激任何帮助。

4

2 回答 2

2

看起来你有javap输出。不幸的是,javap它只是一个快速调试工具,并且输出不是为了能够重新组装成类文件而设计的。

如果您希望能够反汇编和重新组装类文件,我强烈建议使用Krakatau,它完全支持类文件规范以及一些未记录的功能,并且可以将任意类文件从二进制文件到文本文件并返回。

如果您想以编程方式执行此操作并且不需要高级功能,我建议您改用 ASM,它是一个库而不是 CLI 工具。

于 2018-01-09T01:47:16.203 回答
0

看,类文件包含一个字节码。因此,当您编写 java 源程序Hello.java并使用javac Hello.java编译它时。它为您提供了一个类文件,即Hello.class该类文件包含一个 Java 字节码,您可以通过以下命令查看:javap -c Hello.class

所以上面你发送的代码,已经是javac编译器编译的字节码,是一个类文件。

于 2018-07-13T08:22:15.710 回答