6

Java を使用して注釈プロセッサを作成しようとしています。この注釈プロセッサは、以下に示すように、注釈付きクラス内の注釈付きネストされたクラスを識別する必要があります。最初にアノテーション付きクラスを処理してから、それらの内部アノテーションを処理します。これはコンパイル時に実行されるため、処理中のクラスに関する既存の知識はありません。Foo 内に複数のネストされたクラスを持つことができます。これらすべてのネストされたクラスの注釈を処理するにはどうすればよいですか。

@MyAnnotation(value="Something important")
public class Foo
{
    private Integer A;

    @MyMethodAnnotation(value="Something Else")
    public Integer getA() { return this.A; }

    @MyAnnotation(value="Something really important")
    private class Bar
    {
        private Integer B;

        @MyMethodAnnotation(value="Something Else that is very Important")
        public Integer getB() { return this.B }     
    }
}

処理中に、ネストされた Bar クラスにアクセスするにはどうすればよいですか? 次のコードは、クラス Foo に関する情報のみを出力します。バーに関する情報を処理するにはどうすればよいですか?

for (Element element : env.getElementsAnnotatedWith(MyAnnotation.class)) {
    if ( element.getKind().equals(ElementKind.CLASS) )
    {
        System.out.println(element.getKind().name() + " " + element.getSimpleName() );
        processInnerClassElement(element);
    }
    else
    {
        System.out.println(element.getKind().name() + " " + element.getSimpleName() );
    }    
}

...


private void processInnerClassElement(Element element)
{
    for (Element e : element.getEnclosedElements() )
    {
        if ( e.getKind().equals(ElementKind.CLASS) )
        {
            System.out.println(e.getKind().name() + " " + e.getSimpleName() );
            processInnerClassElement(e);
        }
        else
        {
            System.out.println(e.getKind().name() + " " + e.getSimpleName()  );
        }
    }
}
4

2 に答える 2

1

これらの注釈が互いにどのように関連しているかに依存すると思います。

@SupportedAnnotationTypes ですべての注釈を宣言するだけで、次のようなプロセス メソッドにいくつかのブロックを含めることができます。

for (Element element : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) {
    MyAnnotation myAnnotation = element.getAnnotation(MyAnnotation.class);
    if (myAnnotation != null) {
        doSomething(myAnnotation, element);
    }
}

for (Element element : roundEnv.getElementsAnnotatedWith(MyMethodAnnotation.class)) {
    MyMethodAnnotation myMethodAnnotation = element.getAnnotation(MyMethodAnnotation.class);
    if (myMethodAnnotation != null) {
        doSomething(myMethodAnnotation, element);
    }
}

element.getEnclosedElements()そうでなければ、あなたが望むものを使用しelement.getEnclosingElement()て達成することができるかもしれません。

于 2012-10-11T23:14:34.403 に答える
-1

これを行うには、特に で宣言されたクラス、それらのクラスの注釈、それらのクラスで宣言されたメソッド、およびそれらのメソッドの注釈Classを取得するために、いくつかのメソッドが必要です。簡単な例を次に示します。MethodFoo

public static void main(String... args) {
    for (Class<?> declaredClass : Foo.class.getDeclaredClasses()) {
        MyAnnotation myAnnotation = declaredClass.getAnnotation(MyAnnotation.class);
        // Process value of class annotation here
        for (Method method : declaredClass.getDeclaredMethods()) {
            MyMethodAnnotation myMethodAnnotation = method.getAnnotation(MyMethodAnnotation.class);
            // Process value of method annotation here
        }
    }
}

Java でのリフレクションに関するドキュメントを読むと、洞察が得られるかもしれません: http://docs.oracle.com/javase/tutorial/reflect/index.html

于 2012-10-11T20:02:15.527 に答える