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

时间:2016-06-26 09:03:08

标签: java java-annotations

给出这个注释:

@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时,如何声明注释哪个目标是另一个注释?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您应该在处理器上使用@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