-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を用います。このAnnotationMirrorは実体のアノテーションとは違い、ソースコード上での位置を取得することができますし、その型としてAnnotationTypeDeclarationを(ワンステップはさみますが)取得できます。そしてそこからさらに辿っていくとその属性を示すAnnotationTypeElementDeclarationではデフォルトの値としてコードに書かれたのは何か、なんてのが取れます。
普通に考えたらDeclarationシリーズで操作できればそのほうがパワフルだしいいじゃん、と思いますが、そうはどっこい。名前を見てもらったとおり、それぞれ名前がとても長いし、リフレクション(jav.lang.*のそれと区別して、ミラーと呼んでるようですが。。。)を行うAPIの操作のため冗長になってしまうのですね。特にデフォルト値がある属性だと省略可能ですが、Declaration系で操作するとコードに書いてないとnull。だって書いてないから。実態ならデフォルトの値参照が行われて、絶対にnullはありえない。
と、以上より、AnnotationMirrorの存在理由を理解したうえで、その意義はあるかというと、フレームワーク実装者的にはほとんど無いんじゃないかなと思います。かといってこの仕組みがないと取れないソースの詳細情報が出来てしまいますが。。。冒頭の、AnnotationMirrorを使っているサンプルを(自分の書いたもの以外はw)見たことが無いという状況になります。もしこれを有用に使ってるフレームワーク等がありましたらご一報ください。大変興味があります。