ここのところPluggable Annotation Processor APIで遊んでいます。
とはいえ、僕はすごい遅筆といか、遅プログラムなので、
大して進んでいませんが…
AbstractProcessor で取得できるものをリバース・エンジニアリングしてみる
まず、引数とかにどういうものがあるかを
println で調べてみました。
コードは最後の方に掲載しておきます。
AnnotationProcessorでソースコードの解析を行うときに、
一番最初のとっかかりになるのが、
RoundEnvironment#getElementsWithAnnotatedWith(Class<? extends Annotation>)
ではないでしょうか。
このメソッドの戻り値Set<? extends Element>で取得されるElementは、
対象のアノテーションが付与された要素です。
そのアノテーションが付与されたElementに対して以下のコマンドを実行すると、
これらの要素が得られます。
- asType()
- javax.lang.model.type.TypeMirror
- アノテーションが付与された変数、メソッドの戻り値、クラスなどの型(toString()すればQuarifiedNameが取れます。)
- getSimpleName()
- javax.lang.model.element.Name
- アノテーションが付与された変数、メソッドの戻り値、クラスなどの名前
- getModifiers()
- java.util.Set<javax.lang.model.element.Modifier>
- アノテーションが付与された変数、メソッドの戻り値、クラスなどのアクセス修飾子
- getKind()
- javax.lang.model.element.ElementKind
- アノテーションが付与されたものが変数、メソッドの戻り値、クラスなどのどれであるか
- getEnclosingElement()
- javax.lang.model.element.Element
- アノテーションが付与された変数、メソッドの戻り値、クラスなどの所属先(変数やメソッドであればクラス、クラスであればパッケージ)
- getEnclosingElements()
- java.util.Set<javax.lang.model.element.Element>
- アノテーションが付与されたメソッドの引数や戻り値、クラスに所属するフィールドやメソッド
- getAnnotationMirrors()
- java.util.Set<javax.lang.model.element.AnnotationMirror>
- アノテーションが付与された変数、メソッド、クラスに付与されているすべてのアノテーション
以下、解析するために使ったサンプルコード。(JSR-330をベースにしています)
0 件のコメント:
コメントを投稿