如何编写Java注释处理器?

Chr*_*rle 25 java annotations

我可能只是在寻找错误的方向,但我发现注释处理的JSE文档非常稀疏.我想编写一个注释处理器,它处理带注释的String字段和局部变量,用计算的String表达式替换它们.这不应该太复杂,但我在Javadoc for javax.annotation.processing中迷失了.

编辑:我需要在编译时处理注释,因为我想修改生成的代码.它应该用计算的String表达式替换带注释的常量String表达式.

Phi*_*all 15

使用编译时注释处理器无法完成此操作.编译时间注释处理器只能生成他们无法修改现有类的新文件(和类).你可以在运行时进行反射,但严格来说,你不称为注释处理.此外,您将无法访问本地变量.

如果您正在研究如何编写编译时注释处理器,请查看https://github.com/pellaton/spring-configuration-validation-processor


mer*_*nst 8

执行此操作的两个工具是Project LombokDuctileJ.在最初提出问题时,这两种工具都存在; 现在肯定存在其他工具.

关键思想是编写一个注释处理器,在编译期间,在代码生成之前遍历并修改程序的AST(抽象语法树).编译器不会更改磁盘上的源代码,但生成的.class文件将反映注释处理器所做的更改.

您可以根据自己的需要调整其中一种工具,也可以根据实施技术实现自己的工具.

编译时处理比类文件处理有两个优点.一个是编译器通常具有比编译代码更多的信息.另一个原因是,在编译期间,所有事情都在一个步骤中发生,而不是要求开发人员在编译后运行单独的工具来重写.class文件.

  • 确定,并且值得一提的是,两者都使用hack来修改AST,利用Java中当前注释处理器中的错误,利用内部javac API,这些API可以在将来的某些JDK中修复/删除(这会成为一个很大的缺点对我来说). (2认同)