可以在编译时操作JVM字节码吗?

时间:2013-01-28 18:51:10

标签: java compilation bytecode java-bytecode-asm

是否可以在编译时使用像ASM这样的字节码操作库?

具体来说,我想使用Java的注释处理API在带注释的类上实现样板重的方法。实现annotation processor非常简单,但运行.class时似乎尚不存在Processor个文件。还有另一种方式吗?

3 个答案:

答案 0 :(得分:1)

您可能对Javassist(http://www.jboss.org/javassist)感兴趣,它可以在编译后的步骤中增强和保存类。

本文介绍如何保存增强类:http://java.dzone.com/articles/implementing-build-time

特别是,一旦你改变了一个类,你就可以这样做:

 compiledClass.writeFile("/tmp/modifiedClassesFolder");

答案 1 :(得分:1)

应该可以,因为以下项目正在执行它:Project Lombok

此外:

Java 8将带来一种新机制,允许您为Java编译器(javac)编写插件。编译器插件允许您向javac添加新阶段,而无需更改其代码库。新行为可以封装在插件中并分发给其他人使用。例如,javac插件可用于执行以下操作:

•添加额外的编译时检查

•添加代码转换

•执行源代码的自定义分析

答案 2 :(得分:-1)

您应该使用CGLib。使用CGLib,您可以使用方法拦截器添加代理,并让拦截器实现您的样板代码。另一种选择是看看Javassist。使用Javassist,您可以使用实际文本(在字符串中)创建一个新的子类,并让javassist将其编译为字节代码。