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