Java/アノテーション
ソースコードのクラスやメソッドに対して、情報(メタデータ)を注記できるしくみのこと。
コンパイラや実行環境が、アノテーションを解釈して何らかの処理を行うことができる。
標準APIでは、次のようなアノテーションがある。
・Override:スーパークラスのメソッドをオーバーライドすることを示す
・Deprecated:クラスやメソッドが非推奨であることを示す
・SuppressWarnings:コンパイル時の警告を抑制する
アノテーション型は、interface型の特殊なもので、下記5つの特徴がある。
・アノテーション型宣言ではジェネリックは使えない
・アノテーション型は暗黙のうちにjava.lang.annotation.Annotationを拡張する(他のクラスからextendsできない)
・アノテーション要素はパラメータを持てない
・アノテーション要素は型パラメータを持てない
・アノテーション要素はthrows節を持てない
アノテーションの定義
public @interface Information1 {
String value();
double value2() default 1.0; // デフォルト値を持たせることも可能
Information2 information2(); //他のアノテーション型の要素を持つことが可能
}
public @interface Information2 {
String description() default "";
}
アノテーションの利用
@Information1(
value = "neko",
information2 = @Information2
)
public class A {...}
アノーテション型に付けるアノーテションのことをメタアノテーションと言う。
Targetアノテーションは、アノテーションをどのプログラム要素へ付けるかをチェックできる。
Targetアノテーション型は標準で用意されており、ElementType型の配列だけを要素に持つ。
ElementType型はプログラム要素の種類を表すenum型で、
「ANNOTATION_TYPE」「CONSTRUCTOR」「FIELD」「LOCAL_VARIABLE」
「METHOD」「PACKAGE」「PARAMETER」「TYPE」といった定数が定義されている。
@Target(ElementType.METHOD)
public @interface MethodInformation {...}
Retentionアノテーション型を使うと、指定したアノテーションについて、
「どのタイミングでアクセスができるようにしておくか」をアノテーション型を定義するときに指定できる。
指定できる値はRetentionPolicy型で、以下定数が定義されている。
・SOURCE:クラスを生成するときにコンパイラにより破棄
・CLASS:クラスファイルには存在。ただし、実行時には破棄
・RUNTIME:実行時に利用可能