2013年2月7日木曜日

Pluggable Annotation Processor API で遊んでみる

みけです。

ここのところ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 件のコメント:

コメントを投稿