我知道BCEL,但这个项目似乎已经死了,因为它已经两年没有发布了。 Java世界继续前进。例如,JDK 1.6有一个新的类文件格式。
那么可以使用哪个库为JVM创建字节码。如果没有库,程序也可以,如果我可以详细操作生成的代码,例如字节码 - 汇编程序。
您可以推荐哪种软件?是否容易使用?有很好的例子/教程?
编辑:对于所有问:是的,javac很好。但是为了在运行时生成一些类,直接到字节码的路径会更清晰。答案 0 :(得分:19)
ASM
它比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)
答案 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并编译它?]