0

この注釈が与えられた場合:

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

}

@Interceptor私のライブラリのユーザーは、次のように で注釈が付けられたカスタム注釈を作成する API を拡張できます。

@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;
  }

クラスに注釈が付けられている場合、processor#processメソッドは通知されません@Bypass

では、 を使用する場合AbstractProcessor、どのターゲットが別の注釈であるかをどのように主張するのでしょうか?

4

2 に答える 2

1

注釈プロセッサが、注釈でメタ注釈が付けられたすべての注釈をスキャンしている場合は"*"、サポートされている注釈の種類を指定してから、各注釈の宣言を検査する必要があります (対象ProcessingEnvironment.getElements()のメタ注釈があるかどうかを判断するために使用します)。

于 2016-06-26T16:49:23.023 に答える
1

@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

于 2016-06-26T16:40:04.030 に答える