如何直接在java字节码/创建.class文件上编写?

时间:2016-04-20 20:25:11

标签: java jvm bytecode .class-file

我想自己创建一个.class文件,以便我可以在JVM上运行它。

换句话说,我想直接编写java字节码,但我不能看一下类文件的结构。我可以反编译并查看字节码指令,但我想要实现的是反向过程 - 将字节码转换为.class文件。

我读了一下.class文件结构e。 G。 http://viralpatel.net/blogs/tutorial-java-class-file-format-revealed/ 但是我无法组装它所以我可以运行一个程序。我也找不到一个可以遵循的工作示例,所以我可以创建自己的文件。

我读到Jasmin做过类似的事情,但我真的很想直接做。

3 个答案:

答案 0 :(得分:3)

问题是你是想以人性化的格式编写自定义字节码,还是想要手工编写二进制类文件。

如果你想手工编写二进制文件,你显然需要一个十六进制编辑器。我以前直接在十六进制编辑器中编写了类文件,这是一个非常烦人且容易出错的过程,对于比Hello World更复杂的事情来说它实际上并不可行。

幸运的是,我写了一个assembler,它允许你以人类友好的文本形式编写字节码并将其组装成二进制类文件。与其他Java字节码汇编程序不同,Krakatau为您提供对结果的非常低级别的控制,旨在支持完整的类文件格式,以及JVM在实践中接受的一些未记录的功能。

这使您可以执行任何您想要的操作,而Krakatau会自动为您处理低级文件格式详细信息和二进制编码。它与您直接编写类文件的距离非常接近,而不是在十六进制编辑器中手动编写。

以下是使用v0 Krakatau语法的Hello World程序的程序集文件示例。

.class public hello
.super java/lang/Object

.method public static main : ([Ljava/lang/String;)V
    .limit stack 10
    .limit locals 10

    getstatic java/lang/System out Ljava/io/PrintStream;
    ldc "Hello World!"
    invokevirtual java/io/PrintStream println (Ljava/lang/Object;)V
    return
.end method

答案 1 :(得分:1)

除非您在本周编写在JVM上运行的新语言,否则我不确定您为什么要这样做,但class file format文档适合您。

答案 2 :(得分:1)

您可能最好使用像ASM这样的现有库来完成这项工作。这允许您生成字节码而无需直接写出二进制格式。

不相关但是有人在字节码格式here之上构建新语言。这可能会随着时间的推移而定,但可能值得一读。作为起点。