アノテーションまとめ

おはようさん。struts2アノテーション機能をやる前にJava5のアノテーションのおさらい。忘れないうちにまとめとく。
そもそもアノテーションとは、宣言に対する付加情報で、式やら制御文やらメソッド呼び出しには付与できない。宣言っていうのは、クラス宣言、メソッド宣言、変数宣言など。
アノテーションは、修飾語のように振舞う。publicやstaticのような感じ。
そして、アノテーションの存在範囲みたいなものが定義されていて、ソースコード上のみ有効(RetentionPolicy.SOURCE)なもの(@Overrideとか@SuppressWarningsみたいなもの)は、コンパイル時に利用されて、生成されるクラスファイルには出力されない。
また、実行時のメモリ上においても保持(RetentionPolicy.RUNTIME)されるもの(例えばstruts2の@Validationsとか)は、実行時に動的に参照できる情報となるため、DIなどによく使われる。
この二つの中間にあたるものが、クラスファイルには書き込まれるが、メモリには読み込まれない(RetentionPolicy.CLASS)ものがあり、独自のクラスローダーなんかで利用(?)することができそう。あと、CVSの$Id$のようなものの埋め込みに使えるかも。JUnitの新しい記法もこれかな?
そしてそもそも、アノテーションで表現できるのは、「変数名=値」のペアだけで、その特殊形として、なんの値も定義しないもの(@Override)、単一の変数に対する値を表現するもの(@SuppressWarnings)がある。
アノテーション情報を読み取るためには、二つの公式手段があり、コンパイル時にはcom.sun.mirrorあたりのミラーAPIを使う。これを実装したものがapt。メモリ上でアクセスするにはJava5で拡張されたjava.lang.reflectのリフレクションAPIを使う。
で、詳しくは、Wikipediaによる解説とか、ITアーキテクトによる解説あたりでどうぞ。