2012-07-08 14 views
23

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

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

+0

同意,我的入口点是本教程:http://tutorials.jenkov.com/java-reflection/annotations.html – 2012-07-08 18:39:13

+2

你想在编译时或运行时处理注释吗?请注意,由于javac的一个愚蠢限制,局部变量的注释是无效的。 – 2012-07-08 18:43:52

+0

我想在编译时处理它们,所以这显然只适用于常量字符串表达式。 – 2012-07-08 19:03:38

回答

14

这不能用编译时注释处理器完成。编译时间注释处理器只能生成新文件(和类),它们不能修改现有类。您可以在运行时进行反射,但严格来说,这不称为注释处理。你也不能访问局部变量。

如果你正在寻找如何编写一个编译时注释处理器退房https://github.com/pellaton/spring-configuration-validation-processor

+0

理论上,您可以使用注释处理器+ Apache BCEL(或类似的东西)来修改原始.class文件。但这听起来很混乱。 – vanza 2012-07-08 18:53:13

+0

错......什么?使用注释框架编译前我无法修改源代码? – 2012-07-08 19:11:35

+1

我看着链接的代码。显然它不生成代码,它只是验证它。我希望能够在实际的代码生成步骤之前修改抽象语法树。 – 2012-07-08 19:28:07

4
+0

我看了Javassist和ASM。也许他们会完成这项工作,但他们是关于字节码操作的。我非常希望使用一个工具来允许我操作抽象语法树。字节代码操作只是我最后的手段。 – 2012-07-08 22:41:40

+0

好的,在调查了这些选项后,似乎字节码操作是唯一可行的选择。接下来的挑战是将其整合到Maven构建中 - 不仅仅针对我,也针对我的图书馆用户。 – 2012-07-09 12:53:46

+0

嗯......操纵AST将是_my_最后的手段:) – 2012-07-10 22:50:16

8

这样做的两个工具是Project LombokDuctileJ。这两种工具在问题最初提出时都存在;现在肯定存在其他工具。

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

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

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

+0

当然,值得一提的是,两者都使用hack来修改AST,利用当前Java注释处理器中的错误,利用内部的javac APIs在一些未来的JDK中修复/删除(这对我来说是一个很大的缺点)。 – 2015-11-11 16:58:56