利用方法は?

実行時に読み込んで何かの処理を後付けするような動的な使い方や
ソースコードXMLなどをJavaソースをもとに生成するような静的な使い方が
あるらしい。
どちらかというと後者に興味あり。

独自アノテーションの作成

アノテーションの宣言は @interface キーワードを用います。
また、java.lang.annotation.Annotationを暗黙的に継承する為、別のアノテーション
を継承させるといった使い方はできません。


①メンバを持たないアノテーション

public @interface AnnotationTest { }

②1つのメンバを持つアノテーション

public @interface AnnotationTest {
	String value();
}

特にメンバが1つの場合、valueというメンバを定義します。

③複数のメンバを持つアノテーション

public @interface AnnotationTest {
	int id();
	String[] names();
	String comment() default "no comment."; // デフォルトを指定すると省略できる
	AnnotationTypeEnum type(); // 列挙型
}
public enum AnnotationTypeEnum {
	TYPE_1,
	TYPE_2,
	TYPE_3
}

※.列挙型を指定した例
※.デフォルト値を指定すると省略可能。(デフォルト値の指定には、defaultキーワードを使う。)


また、メソッドの戻り値には、プリミティブ型、String、Class、列挙型、アノテーション
しか指定できないとのこと。

メタアノテーションとは?

アノテーションアノテーションです(^^;)


以下のものが、java.lang.annotationパッケージに定義されています。
①Target
②Retention
③Documented
④Inherited


①Target

アノテーション型の宣言にのみ利用できるもので
アノテーションの対象を指定します。

java.lang.annotation.ElementType.ANNOTATION_TYPE - アノテーション
java.lang.annotation.ElementType.CONSTRUCTOR - コンストラク
java.lang.annotation.ElementType.FIELD - フィールド
java.lang.annotation.ElementType.LOCAL_VARIABLE - ローカル変数
java.lang.annotation.ElementType.METHOD - メソッド
java.lang.annotation.ElementType.PACKAGE - パッケージ
java.lang.annotation.ElementType.PARAMETER - パラメータ
java.lang.annotation.ElementType.TYPE - クラス、インタフェース、列挙型

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
public @interface AnnotationTest {
	String value();
}

このアノテーションは、フィールド以外に指定するとコンパイル時に怒られます。

②Retention

アノテーション型の宣言にのみ利用できるもので
アノテーションの利用局面を指定します。
java.lang.annotation.RetentionPolicy.CLASS
- コンパイル後、クラスファイルに記録される。しかし、実行時に VM に読み込まれない。
java.lang.annotation.RetentionPolicy.RUNTIME
- コンパイル後、クラスファイルに記録される。実行時に VM に読み込まれる。
java.lang.annotation.RetentionPolicy.SOURCE
- コンパイル時に破棄される。

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

@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationTest {
	String value();
}

デフォルトはCLASSが指定される。
その為、実行時にリフレクションAPIを使用して、アノテーションにアクセスしたようなら
RUNTIME を指定する必要がある。
しかし、SOURCEやCLASSのアノテーションに関してもapt(Annotation Processor Tool)
というコマンドが提供されており、パーサの役割を果たしてくれるとのこと。
暇があればまた調べてみよう。