2008-11-14 62 views
15

我知道BCEL,但这个项目似乎已经死了,因为它已经有两年没有发布了。 Java世界继续前进。例如,JDK 1.6有一个新的类文件格式。可以使用哪个库/程序来生成Java字节码?

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

您可以推荐哪些软件?用起来容易吗?有很好的例子/教程?

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

回答

19

ASM

http://asm.objectweb.org/

这是远远快于BCEL和支持泛型和注解。关于其体系结构的一点:为了确保高性能,ASM围绕一个抛出事件的解析器(与解析器构建数据结构的BCEL相反)构建。这有点类似于SAX和DOM解析器之间的区别。习惯这种想法需要一些练习。编辑(以下McDowell的评论):的确,访问者在ASM中大量使用,但它不仅仅是普通访问者:访问数据结构是由解析器懒洋洋地构建的,所以如果你对类文件的某些部分不感兴趣(例如,您想知道方法的名称,但不关心它们的正文),则可以从visitMethod()方法返回null。这将使解析器跳过方法体部分,从而防止完全描述该方法的对象网络的(昂贵的)构造。

-2

我觉得我最喜欢的Java字节码的创造者称为javac的,你可以在www.sun.com找到它

+0

我有一种感觉,Mnementh正在问别的东西,我们有一个词汇问题的冲突。 – Karl 2008-11-14 21:40:57

-3

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

[说真的。是什么阻止你把你的源,使得Java和编译了吗?]

+0

在某些情况下,您希望以编程方式生成字节码。如果这是在用户的机器上,那么您不能认为他们已经安装了完整的JDK。 – 2008-11-14 21:54:48

+0

想象一个应用程序非常酷以至于它需要编译器,但是不够酷以将其包含在下载中。虽然技术上可行,但听起来不太可能。 – 2008-11-14 21:57:24

2

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

1

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

4

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

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

相关问题