技術のメモ箱

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アノテーションは、アノテーションをどのプログラム要素へ付けるかをチェックできる。
Targetアノテーション型は標準で用意されており、ElementType型の配列だけを要素に持つ。
ElementType型はプログラム要素の種類を表すenum型で、
「ANNOTATION_TYPE」「CONSTRUCTOR」「FIELD」「LOCAL_VARIABLE」
「METHOD」「PACKAGE」「PARAMETER」「TYPE」といった定数が定義されている。

@Target(ElementType.METHOD)
public @interface MethodInformation {...}

Retentionアノテーション

Retentionアノテーション型を使うと、指定したアノテーションについて、
「どのタイミングでアクセスができるようにしておくか」をアノテーション型を定義するときに指定できる。
指定できる値はRetentionPolicy型で、以下定数が定義されている。
・SOURCE:クラスを生成するときにコンパイラにより破棄
・CLASS:クラスファイルには存在。ただし、実行時には破棄
・RUNTIME:実行時に利用可能

pagetop