哪个库/程序可用于生成Java字节码?

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

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

你能推荐哪种软件? 是否容易使用? 有很好的例子/教程?

编辑:所有问:是的,javac很好。 但是为了在运行时生成一些类,直接到字节码的路径会更清晰。

ASM

http://asm.objectweb.org/

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

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

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

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

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

有像asm和cglib这样的技术,但我推荐Javaassist,因为它是一个非常好的库,你可以在tapestry5框架中找到例子。

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

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

[重视。 什么阻止你从源头,制作Java并编译它?