Gun*_*nar 6 java annotations annotation-processing
我想编写一个注释处理器,它根据处理类型的JavaBeans属性集生成源代码.
这一般起作用,但如果其他注释处理器存在,我正在努力正确地这样做.具体来说,这样的其他处理器可以为我的处理器处理的类型生成超类,因此我也需要考虑该超类型的属性.在随后的回合中,可以生成该超类的超类,等等.
这意味着我不能生成我的源代码,直到我感兴趣的类型的层次结构稳定,即在其他处理器的后续轮次(或在我的处理器运行之后的同一轮)中不会生成更多的超类型.
我怎么知道是不是这样呢?我知道RoundEnvironment#processingOver()并且可能在最后一轮中生成我的代码,但我理解这是一个不好的做法(编译器会发出警告).
回答我自己的问题:
如果带注释的类型的所有超类型都没有错误,则可以认为该类型是稳定的或完整的。一个例子:
@GenClass("Base")
class MyAnnotatedType extends Base {}
Run Code Online (Sandbox Code Playgroud)
在本例中,我们假设有一个注释处理器 A 为其@GenBase生成指定的类。Base另一个处理器B对整个MyAnnotatedType层次结构感兴趣,例如它想要为所有方法(包括继承的方法)生成某种描述符MyAnnotatedType。
如果 B 在 A 之前运行,则该类Base尚不存在,因此当 B 检查 的层次结构时MyAnnotatedType,超类类型镜像将具有类型 kind ERROR。MyAnnotatedTypeB可以将此作为推迟到下一轮处理的指示。
当 A 运行时,它将生成该类Base,从而导致另一轮处理。
如果现在 B 第二次运行,它可以处理上一轮推迟的所有类型。正如Base现在所存在的,它将不再具有类型ERROR。为此,我注意到(使用 javac),重要的是获得一个新的Element表示类型,而不是保留第一轮中仍然包含对错误超类型的引用的类型。
如果Base本身没有错误的超类型,则层次结构MyAnnotatedType完整并且B可以继续处理它。否则,处理将不得不再次推迟,直到层次结构最终完成。如果永远不会生成超类型,无论如何编译都会出错,对于 B 来说,在这种情况下也不生成其代码应该没问题。
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |