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

时间:2008-11-14 21:24:38

标签: java jvm bytecode

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

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

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

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

7 个答案:

答案 0 :(得分:19)

ASM

http://asm.objectweb.org/

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:-2)

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

答案 6 :(得分:-3)

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

[重视。什么阻止你获取源代码,制作Java并编译它?]