【问题标题】:AbstractProcessor, how to claim for annotations which target is another annotation?AbstractProcessor,如何声明哪个目标是另一个注释的注释?
【发布时间】:2016-10-28 11:00:04
【问题描述】:

鉴于此注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Interceptor {
  Class<? extends Behaviour> value();

}

我的库的用户可以扩展其 API,创建带有 @Interceptor 注释的自定义注释,如下所示:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Interceptor(BypassInterceptor.class)
public @interface Bypass {
}

AbstractProcessor 提供了一个名为getSupportedAnnotationTypes 的方法,它返回处理器支持的注释类型的名称。但是如果我指定@Interceptor的名字,如下:

 @Override public Set<String> getSupportedAnnotationTypes() {
    Set<String> annotations = new LinkedHashSet();
    annotations.add(Interceptor.class.getCanonicalName());
    return annotations;
  }

当一个类被@Bypass注解时,processor#process方法不会被通知。

那么,当使用AbstractProcessor 时,如何为注解声明哪个目标是另一个注解?

【问题讨论】:

    标签: java java-annotations


    【解决方案1】:

    如果您的注解处理器正在扫描使用您的注解进行元注解的所有注解,您需要为您支持的注解类型指定"*",然后检查每个注解的声明(使用ProcessingEnvironment.getElements() 来确定是否它具有感兴趣的元注释。

    【讨论】:

    • 感谢您的回复,这正是我现在正在做的事情,尽管 javadoc 不鼓励使用它。但是我一直在尝试检索这些注释。你能看看这个另一个问题吗? stackoverflow.com/questions/38040104/…
    【解决方案2】:

    你应该在你的处理器上使用@SupportedAnnotationTypes注解,而不是覆盖getSupportedAnnotationTypes()方法,例如:

    @SupportedAnnotationTypes({"com.test.Interceptor"})
    public class AnnotationProcessor extends AbstractProcessor {
        ...
    

    Processor.getSupportedAnnotationTypes() 方法可以构造它的 此注释的值的结果,由 AbstractProcessor.getSupportedAnnotationTypes()。

    Javadoc:

    https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/SupportedAnnotationTypes.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多