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