我可能只是在寻找错误的方向,但我发现关于注释处理的 JSE 文档非常……稀疏。我想编写一个注释处理器来处理带注释的字符串字段和局部变量,以用计算的字符串表达式替换它们。这不应该太复杂,但我很迷失在 javax.annotation.processing 的 Javadoc 中。
编辑:我需要在编译时处理注释,因为我想修改生成的代码。它应该用计算的字符串表达式替换带注释的常量字符串表达式。
我可能只是在寻找错误的方向,但我发现关于注释处理的 JSE 文档非常……稀疏。我想编写一个注释处理器来处理带注释的字符串字段和局部变量,以用计算的字符串表达式替换它们。这不应该太复杂,但我很迷失在 javax.annotation.processing 的 Javadoc 中。
编辑:我需要在编译时处理注释,因为我想修改生成的代码。它应该用计算的字符串表达式替换带注释的常量字符串表达式。
这不能通过编译时注释处理器来完成。编译时注释处理器只能生成新文件(和类),它们不能修改现有类。您可以在运行时进行反射,但严格来说您不称为注释处理。此外,您将无权访问局部变量。
如果您正在研究如何编写编译时注释处理器,请查看https://github.com/pellaton/spring-configuration-validation-processor
执行此操作的两个工具是Project Lombok和DuctileJ。在最初提出问题时,这两种工具都存在;现在肯定存在其他工具。
关键思想是编写一个注释处理器,在编译期间,在代码生成之前,遍历和修改程序的 AST(抽象语法树)。编译器不会更改磁盘上的源代码,但生成的 .class 文件将反映注释处理器所做的更改。
您可能能够调整其中一种工具以满足您的需求,或者您可以实施受其实施技术启发的自己的工具。
与类文件处理相比,编译时处理有两个优点。一是编译器通常拥有比已编译代码更多的信息。另一个是在编译期间一切都在一个步骤中发生,而不是要求开发人员在编译后运行单独的工具来重写 .class 文件。
查看