哪个库/程序可用于生成 Java 字节码?[已关闭]

2022-09-03 13:19:26

我知道BCEL,但这个项目似乎已经死了,因为它已经两年没有发布了。Java世界继续前进。例如,JDK 1.6 具有新的类文件格式。

那么可以使用什么库来为JVM创建字节码。如果没有库,程序也可以,如果我可以详细操作生成的代码,例如字节码汇编器。

您可以推荐哪种软件?是否也容易使用?有很好的示例/教程吗?

编辑:对于所有询问的人:是的,javac很好。但是对于在运行时生成一些类,直接指向字节码的路径会更清晰。


答案 1

断续器

http://asm.objectweb.org/

它比 BCEL 快得多,并支持泛型和注释。关于其体系结构的一点:为了确保高性能 ASM 是围绕引发事件的解析器构建的(与 BCEL 相反,BCEL 的解析器构建数据结构)。这有点类似于SAX和DOM解析器之间的区别。需要一些练习才能习惯这种想法。

编辑(遵循McDowell的评论):确实,访问者在ASM中被大量使用,但它不仅仅是普通的访问者:访问的数据结构是由解析器懒惰地构建的,所以如果你对类文件的某些部分不感兴趣(例如,你想知道方法的名称,但你不关心它们的主体), 您可以从 visitMethod() 方法返回 null。这将使解析器跳过方法主体部分,从而防止(昂贵的)构建完全描述方法的对象网络。


答案 2

有一个相当完整的示例,在实现 CAL(用于 JVM 的类似 Haskell 的语言)时,使用 ASM 从类似 Java 的中间语言生成字节代码。如果您在 http://openquark.org/Open_Quark/Download.html 下载源代码,则可以在同一文件夹中找到AsmJavaByteCodeGenerator.java和java模型类中的代码。生成的代码基本上是javac会做的,减去调试注释。

CAL 实现最初使用 BCEL,但后来改用 ASM,因为 ASM 明显更快(可能是一个数量级),同样重要的是,ASM 是线程安全的,因此可以进行并发编译,这是 CAL 所需要的。


推荐