15

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

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

有什么软件可以推荐?是不是也很容易使用?有很好的例子/教程吗?

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

4

7 回答 7

20

ASM

http://asm.objectweb.org/

它比 BCEL 快得多,并且支持泛型和注释。关于其架构的一点:为了确保高性能 ASM 是围绕抛出事件的解析器构建的(与解析器构建数据结构的 BCEL 形成对比)。这有点类似于 SAX 和 DOM 解析器之间的区别。需要一些练习才能习惯这种思维方式。

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

于 2008-11-14T21:28:20.003 回答
4

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

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

于 2008-12-06T06:08:41.320 回答
2

Javassistcglib是两个很好的字节码工程库。它们在 Java EE 世界中被广泛用于在运行时生成对象代理。Hibernate 和 Spring 是使用这些库的两个主要框架。

于 2008-11-14T22:45:54.450 回答
2

http://serp.sourceforge.net/是一个很棒的库,可以在编辑字节码时进行更多抽象。

于 2009-06-18T21:00:42.083 回答
1

有 asm 和 cglib 之类的技术,但我推荐Javaassist,因为它是一个非常好的库,您可以在 Tapestry5 框架中找到示例

于 2008-11-15T00:23:59.430 回答
-2

我认为我最喜欢的 java 字节码创建器叫做 javac,你可以在 www.sun.com 找到它

于 2008-11-14T21:25:56.843 回答
-3

为什么不使用 Java 编译器 javac?用它来生成 JVM 字节码有什么问题?

[严重地。是什么阻止您获取源代码、制作 Java 并编译它?]

于 2008-11-14T21:26:24.563 回答