如何编写Java注释处理器?

如何编写Java注释处理器?,java,annotations,Java,Annotations,我可能只是看错了方向,但我发现JSE文档中关于注释处理的内容非常。。。稀疏的我想编写一个注释处理器,它处理带注释的字符串字段和局部变量,用计算字符串表达式替换它们。这应该不会太复杂,但我在Javadoc for javax.annotation.processing中迷失了方向 编辑:我需要在编译时处理注释,因为我想修改生成的代码。它应该用计算字符串表达式替换带注释的常量字符串表达式。这不能用编译时注释处理器来完成。编译时注释处理器只能生成新文件(和类),而不能修改现有类。您可以在运行时进行反射

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


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

这不能用编译时注释处理器来完成。编译时注释处理器只能生成新文件(和类),而不能修改现有类。您可以在运行时进行反射,但严格来说,这不是注释处理。此外,您将无法访问局部变量

如果您正在研究如何编写编译时注释处理器,请检查

  • Javassist
  • ASM
  • Byteman(用于运行时)

实现这一点的两个工具是和。这两种工具在最初提出问题时都存在;现在肯定存在其他工具

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

您可以调整这些工具中的一个以满足您的需要,或者您也可以根据它们的实现技术实现自己的工具


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

同意,我的切入点是本教程:您想在编译时还是运行时处理注释?请注意,由于愚蠢的javac限制,局部变量上的注释实际上是无用的。我想在编译时处理它们,所以这显然只适用于常量字符串表达式。您可以使用ANT,但这可能取决于“计算”的含义。请参阅示例。也许它会有用:理论上,您可以使用注释处理器+ApacheBcel(或类似工具)来修改原始的.class文件。但这听起来很混乱。呃。。。什么?我无法在使用注释框架编译之前修改源代码?我查看了链接的代码。显然,它不会生成代码,只是验证代码。我希望我能在实际的代码生成步骤之前修改抽象语法树。我认为你唯一的选择是字节码操作(使用例如ASM、BCEL)或一些类路径技巧,比如引用注释处理器生成的类,而不是原始文件或类似的东西…@christian schlichtherle Yes,你不能修改。看看这本书。“这些反射式API提供了程序结构的构建时、基于源代码的只读视图。”“运行可以生成新源代码和其他文件的注释处理器”我已经介绍了Javassist和ASM。也许他们会做这项工作,但他们是关于字节码操作的。我非常喜欢使用一个工具,它允许我操作抽象语法树。字节码操作只是我最后的选择。好的,在调查了这些选项之后,字节码操作似乎是剩下的唯一可行的选项。下一个挑战是将其集成到Maven构建中——不仅对我来说,对我的库的用户也是如此。当然,值得一提的是,两者都使用黑客来修改AST,利用Java当前注释处理器中的一个bug,利用内部javac API,这些API可以在未来的JDK中修复/删除(这对我来说是一个很大的劣势)。