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()
判断是否有感兴趣的元注解。
鉴于此注释:
@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()
判断是否有感兴趣的元注解。