-AnnotationMirror
Aptのプロセッサを書いていて、果たしてAnnotationMirrorを用いたコードって見たことあるかな?と。Aptでは以下のようなコードが書けます。
public void visitTypeDeclaration(TypeDeclaration typeDecl) { Foo foo = typeDecl.getAnnotation(Foo.class); _env.getMessager.printNotice("foo.bar: " + foo.bar()); }
要はダイレクトにアノテーションの実体に触れることができます。ほかは基本的にDeclarationで、その世界に持ってくには、Declaration#getAnnotationMirrors(): Collection
普通に考えたらDeclarationシリーズで操作できればそのほうがパワフルだしいいじゃん、と思いますが、そうはどっこい。名前を見てもらったとおり、それぞれ名前がとても長いし、リフレクション(jav.lang.*のそれと区別して、ミラーと呼んでるようですが。。。)を行うAPIの操作のため冗長になってしまうのですね。特にデフォルト値がある属性だと省略可能ですが、Declaration系で操作するとコードに書いてないとnull。だって書いてないから。実態ならデフォルトの値参照が行われて、絶対にnullはありえない。
と、以上より、AnnotationMirrorの存在理由を理解したうえで、その意義はあるかというと、フレームワーク実装者的にはほとんど無いんじゃないかなと思います。かといってこの仕組みがないと取れないソースの詳細情報が出来てしまいますが。。。冒頭の、AnnotationMirrorを使っているサンプルを(自分の書いたもの以外はw)見たことが無いという状況になります。もしこれを有用に使ってるフレームワーク等がありましたらご一報ください。大変興味があります。