AbstractProcessor,如何声明哪个目标是另一个注释的注释?

AbstractProcessor, how to claim for annotations which target is another annotation?

鉴于此注释:

@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 provides a method called getSupportedAnnotationTypes 其中 returns 处理器支持的注释类型的名称。但是如果我指定@Interceptor的名字,如下:

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

当class被@Bypass注解时,processor#process方法将不会被通知。

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

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

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

The Processor.getSupportedAnnotationTypes() method can construct its result from the value of this annotation, as done by AbstractProcessor.getSupportedAnnotationTypes().

Javadoc:

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

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