2005.12.12 株式会社四次元データ CTO 畠中晃弘
- 7.1. 標準アノテーション型
- 7.2. アノテーションの定義
- 7.3. 標準メタアノテーション型
7.3. 標準メタアノテーション型
アノテーションはアノテーション型に対しても定義することができます。そのようなアノテーション型を対象とするアノテーション型を特にメタアノテーション型と呼びます。ここではあらかじめ定義されている標準メタアノテーション型を説明します。標準メタアノテーション型は4つあります。
- Target
- Retention
- Documented
- Ingerited
これらのアノテーション型はすべて java.lang.annotation パッケージで定義されています。
Target アノテーション
Target アノテーション型は、アノテーションがどの要素(クラスやメソッドなど)に対して適用することができるかを定義します。指定する要素は enum 型の java.lang.annotation.ElementType で定義されています。
値 | 説明 |
---|---|
TYPE | クラス・インタフェース・enum・アノテーションの宣言 |
FIELD | フィールドの宣言(enum定数を含む) |
METHOD | メソッドの宣言 |
PARAMETER | メソッドのパラメータの宣言 |
CONSTRUCTOR | コンストラクタの宣言 |
LOCAL_VALIABLE | ローカル変数の宣言 |
ANNOTATION_TYPE | アノテーション型の宣言 |
PACKAGE | パッケージの宣言 |
たとえば先ほど示した Override アノテーションの定義をみると、Override アノテーションはメソッドのみに付加できることがわかります。
「パッケージの宣言」について補足します。これまでパッケージの情報を記述するためには javadoc で処理される package.html ファイルを使用していましたが、J2SE5.0 では package-info.java ファイルがパッケージの情報を記述するためのファイルとなりました。ターゲットが PACKAGE のアノテーションはその package-info.java ファイル内で使用することができます。package-info.java ファイルは javadoc でも処理されますので、これまでの package.html ファイルを置き換えるものとなります。
Retention アノテーション
Retention アノテーションは、アノテーションで付加された情報がどの段階まで保持されるかを定義します。指定する段階は enum 型の java.lang.annotation.RetentionPolicy で定義されています。
値 | 説明 |
---|---|
SOURCE | ソース上だけのアノテーションで、クラスファイルには記録されないことを示します。 |
CLASS | クラスファイルにもアノテーションの情報が記録されます。ただしそのクラスをJVMにロードしても、JVMにはアノテーションの情報はロードされません。Retention アノテーションを指定しなかった場合、CLASS を指定したとみなされます。 |
RUNTIME | クラスファイルに情報が記録され、さらにクラス使用時にはJVMにも情報がロードされます。JavaプログラムからリフレクションAPIを利用してアノテーションの情報を読み取るためには、この種別でなければいけません。 |
Retention ポリシーが RUNTIME と指定された場合のアノテーション情報の読み取り方法についてはこの章では説明しません。
Documented アノテーション
Documented アノテーションは、対象となるアノテーションにより付加した情報が javadoc コマンドなどで作成したドキュメントに反映されなければならないことを示します。Documented アノテーションはマーカーアノテーションであり、要素は持ちません。どのようにドキュメントに反映されるかは、ドキュメントを生成するプログラムの実装に依存します。
Inherited アノテーション
Inherited アノテーションは、クラス宣言に付加するアノテーションが、対象となるクラスのサブクラスにも継承されることを指示するものです。
実際に Override アノテーションの定義を見ると、Override アノテーションはメソッドに対してのみ使用でき、コンパイル時にのみだけ参照されてクラスファイルには情報が記録されないことがわかります。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override {}