目次へ

2005.12.12 株式会社四次元データ CTO 畠中晃弘

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 {}
 

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ