Annotationsをたしなむ

JSR 175のMetadata(Annotations)がJDK1.5の一部になってリリースされています。JSR 175が汎用で、EJB3.0などWebサービスで使われるJ2EE用のAnnotationsがJSR 181です。この2つのJSR番号をよく見掛けるのでいったいどんなものか試してみることにしました。
JDK1.5のドキュメント『Annotations』やIBM developerWorksの『IBM Developer 日本語版 : 大変申し訳ありません。このページは無効です。』が参考になります。これ以外にも、『http://www.jroller.com/page/kurt/20040520』なものを発見。そのまま動きそうなコードだったので試してみました。
まずはannotationのクラス(インタフェース、か?)

package com.netpotlet.dhoni;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(java.lang.annotation.ElementType.METHOD)
public @interface RequestForEnhancement {
    int id(); // Unique ID number associated with RFE
    String synopsis(); // Synopsis of RFE
    String engineer(); // Name of engineer who implemented RFE
    String date(); // Date RFE was implemented
}

次はannotationを利用するクラス

package com.netpotlet.dhoni;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class MetaTest {

    @RequestForEnhancement(
        id=1,
        synopsis="synopsis",
        engineer="engineer1",
        date="date")
    public static void testMethod() {
    }
    
    private MetaTest() {
        try {
            Annotation a = 
                getClass().getMethod("testMethod", null).getAnnotations();
            for (int i=0; i args) {
        new MetaTest();
    }
}

コンパイルはjavacじゃだめ。一見、コンパイルできていそうだし、クラスファイルもできるけれど、実行すると"java.lang.Error: コンパイル問題が未解決です。" というエラーが出てしまう。apt(annotation processing tool)というツールを使ってコンパイルします。javaコマンドで実行すると、このように出力されました。

a[0]=@com.netpotlet.dhoni.RequestForEnhancement(id=1, synopsis=synopsis, engineer=engineer1, date=date) 

Annotations は他にもいろいろ、使い道は多いようです。JDKのドキュメントを見るとメタメソッドのようにも使えるらしい。
でも、Eclipse(3.0.1)はまったく対応していませんでした。Eclipseのインストール済みのJREはJDK1.5.0になっていますが、コンパイラー準拠レベルは1.4までしか指定できません。エディターはぼろぼろ、赤ばってんばかり。Antにもまだaptタスクがないので、apt実行は手入力しました。