【发布时间】:2013-01-28 18:51:09
【问题描述】:
是否可以在编译时使用像 ASM 这样的字节码操作库?
具体来说,我想使用 Java 的注释处理 API 在带注释的类上实现繁重的样板方法。实现annotation processor 很简单,但是当Processor 运行时,.class 文件似乎还不存在。还有其他方法吗?
【问题讨论】:
标签: java compilation bytecode java-bytecode-asm
是否可以在编译时使用像 ASM 这样的字节码操作库?
具体来说,我想使用 Java 的注释处理 API 在带注释的类上实现繁重的样板方法。实现annotation processor 很简单,但是当Processor 运行时,.class 文件似乎还不存在。还有其他方法吗?
【问题讨论】:
标签: java compilation bytecode java-bytecode-asm
您可能对 Javassist (http://www.jboss.org/javassist) 感兴趣,它可以在编译后步骤中增强和保存类。
本文介绍如何保存增强类:https://dzone.com/articles/implementing-build-time
特别是,一旦你改变了一个类,你可以这样做:
compiledClass.writeFile("/tmp/modifiedClassesFolder");
【讨论】:
Ant,你能提供一个Gradle的例子吗?
应该可以,因为以下项目正在这样做:Project Lombok
还有:
Java 8 将带来一种新机制,允许您为 Java 编译器 (javac) 编写插件。编译器插件允许您向 javac 添加新阶段,而无需更改其代码库。新行为可以封装在插件中并分发给其他人使用。例如,javac 插件可用于执行以下操作:
• 添加额外的编译时检查
• 添加代码转换
• 对源代码进行自定义分析
【讨论】:
您应该改用 CGLib。使用 CGLib,您可以使用方法拦截器添加代理,并让拦截器实现您的样板代码。另一种选择是查看 Javassist。使用 Javassist,您可以使用实际文本(在字符串中)创建一个新的子类,并让 javassist 将其编译为字节码。
【讨论】: