如何编写Java注释处理器?

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

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

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

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

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

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

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

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