Java 注释处理器,处理顺序
Java Annotation Processor, Processing Order
我想知道是否有办法以 class 或至少以某种确定性顺序从上到下处理注释。
似乎不是这种情况,因为 Processor class 仅提供:
boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv);
其中 RoundEnvironment 允许您访问 Set
个带注释的元素,例如:
Set<? extends Element> getElementsAnnotatedWith(TypeElement a)
一切都是无序集合,这使得处理顺序不可预测。除了尝试按元素名称或其他方式手动排序之外,还有什么办法吗?
正如您所发现的,没有办法使用当前接口以指定顺序强制处理注释。
这是一个解决方法。假设您希望处理每个声明注释,例如字段和方法上的注释。不要为这些声明注册任何回调。相反,为每个 class 调用注释处理器。注释处理器从 javac 获取 AST,然后按照您喜欢的顺序遍历它。例如,Checker Framework 使用此实施策略。
此解决方法可能不足以满足您的需求,因为它仍然以任意顺序处理每个 class -- 例如,一个依赖于 javac 的分阶段编译模型的方法。
我想知道是否有办法以 class 或至少以某种确定性顺序从上到下处理注释。
似乎不是这种情况,因为 Processor class 仅提供:
boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv);
其中 RoundEnvironment 允许您访问 Set
个带注释的元素,例如:
Set<? extends Element> getElementsAnnotatedWith(TypeElement a)
一切都是无序集合,这使得处理顺序不可预测。除了尝试按元素名称或其他方式手动排序之外,还有什么办法吗?
正如您所发现的,没有办法使用当前接口以指定顺序强制处理注释。
这是一个解决方法。假设您希望处理每个声明注释,例如字段和方法上的注释。不要为这些声明注册任何回调。相反,为每个 class 调用注释处理器。注释处理器从 javac 获取 AST,然后按照您喜欢的顺序遍历它。例如,Checker Framework 使用此实施策略。
此解决方法可能不足以满足您的需求,因为它仍然以任意顺序处理每个 class -- 例如,一个依赖于 javac 的分阶段编译模型的方法。