アノテーションを拾ってみる

JDK5.0から搭載されたMetadataだが,やっぱり注釈を自分で定義したくなる。そこで,早速自分で注釈を定義してみた。もちろん,Eclipse3.1を使用する。

まずは,Eclipseで「New - Annotation」を選んで,新規作成ウィザードを起動する。

案外シンプルなダイアログだ。ここに名前を入れて,注釈を生成させる。

@interfaceが付いた特別なインタフェース,つまり注釈のコードが生成された。いたってシンプルだ。これに,内容を示すvalue属性を追加する。さらに,実行時にも注釈の情報を得られるように,@Retentionも付与しておく。以下のようなコードだ。

基本的には,これで自作の注釈が完成だ。早速これを使ってみよう。@Targetによる指定はしていないので,この注釈はどの宣言に対しても適用可能だ。適当にクラスを作って,そのクラスに注釈を適用する。

value属性は特別扱いで,「value=」という記述を省略できる。

これで,自作の注釈をつけることができたわけだが,それを利用しないことには何の役にも立たない。そこで,リフレクションAPIを使って,クラスにつけられた注釈をGETしてみる。

まず,先ほど作成したHogeクラスのClassオブジェクトを得て,そのgetAnnotations()を呼び出して,注釈の配列を得る。その注釈が,先ほど作成したBackLog注釈かどうかをinstanceof演算子で判断し,もしtrueならBackLog型でダウンキャストしている。これを見てわかる通り,作成した注釈は型として扱うことができるのだ。@interfaceで宣言された注釈は「特別なインタフェースである」と 前のエントリで示したのも,型になれるということを匂わしたかったためである。

BackLog型として注釈のオブジェクトが得られれば,あとはそれが持つvalue()を呼び出すことにより,Hogeクラスに記述された値を得ることができる。このコードを実行すると,以下のような出力が得られる。正しく注釈にアクセスすることができている。

プログラムで注釈を扱うための方法は,基本的にはこんな感じだろう。動的プロキシかませて注釈に対する処理を行っても良いし,Docletで処理しても良いだろう。

ちなみに,BackLog注釈の@RetentionをRetentionPolicy.CLASSなどに変更すると,Testクラスのmain()を実行しても,注釈の情報は得られなくなった。なるほど,って感じである。

このエントリーをはてなブックマークに追加

関連記事

2023年のRemap

Remapにファームウェアビルド機能を追加しました

Google I/O 2023でのウェブ関連のトピック

2022年を振り返って

現在のRemapと今後のRemapについて