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