【问题标题】:Java Annotation Processor, Processing OrderJava注解处理器,处理顺序
【发布时间】:2015-10-29 02:01:33
【问题描述】:

我想知道是否有一种方法可以在一个类中从上到下处理注释,或者至少以某种确定的顺序。

情况似乎并非如此,因为Processor 类只提供:

boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv);

RoundEnvironment 允许您访问带注释元素的Set,例如:

Set<? extends Element>  getElementsAnnotatedWith(TypeElement a)

一切都是无序的集合,这使得处理的顺序不可预测。除了尝试按元素名称或其他东西手动排序之外,还有其他方法吗?

【问题讨论】:

    标签: java annotations preprocessor


    【解决方案1】:

    正如您所发现的,没有办法使用当前接口强制按指定顺序处理注释。

    这是一种解决方法。假设您希望处理每个声明注释,例如字段和方法的注释。不要为这些声明注册任何回调。相反,为每个类调用注释处理器。注释处理器从 javac 获取 AST,然后按照您喜欢的顺序对其进行处理。例如,Checker Framework 使用了这种实现策略。

    这种解决方法可能不足以满足您的需求,因为它仍然以任意顺序处理每个类——例如,依赖于 javac 的分阶段编译模型的类。

    【讨论】:

    • 感谢您的回答。我很好奇如何在 auto/AutoValue 项目中进行排序。它们生成一个 POJO,其中构造函数参数保证与类中的抽象方法具有相同的顺序。他们是否使用您上面描述的过程来实现这一点?
    • 抱歉,我不确定这个工具是如何工作的——你可以调查它的source code。在实践中,诸如 javac 之类的编译器以确定的顺序为您提供成员,但根据注释处理规范,将来允许更改。我不希望它,但你没有保证。
    • FWIW 这就是 AutoValue 的做法:github.com/google/auto/blob/…。看起来除了 Eclipse 之外的所有东西都可以信任该订单,去看看吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多