Java @interfaceで独自アノテーションを定義
@interface、メタアノテーション、アノテーション属性
独自アノテーションの定義 – @interface命令
@interface name {
definition
}
name: アノテーション名
definition: アノテーション定義
@interface命令を使用して、アノテーションを直接定義することもできる。例えば、次はVersionアノテーションを定義する例である。
Version.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface Version {
double value();
}
メタアノテーション
アノテーション定義では、アノテーション自体に関する情報を定義するためのアノテーションを付与できる。そのようなアノテーションをメタアノテーション(Meta annotation)という。
メタアノテーションの種類は以下のとおりである。
@Retention@Target@Inherited
@Retention
アノテーション情報が保持される範囲。
| アノテーション | 概要 |
|---|---|
@Retention(SOURCE) |
アノテーションはソースコードでのみ利用可能で、コンパイル後には消える。 |
@Retention(CLASS) |
アノテーションは.classファイルに存在するが、ランタイム時には消える。 |
@Retention(RUNTIME) |
アノテーションはコンパイラとランタイムで使用可能。 |
@Target
アノテーションを付与できる対象を指定する。
| アノテーション | 概要 |
|---|---|
@Target(ElementType.TYPE) |
クラスの任意の要素に適用可能。デフォルト値。 |
@Target(ElementType.FIELD) |
クラスの特定フィールド。 |
@Target(ElementType.METHOD) |
クラスのメソッド。 |
@Target(ElementType.PARAMETER) |
メソッドのパラメータ。 |
@Target(ElementType.CONSTRUCTOR) |
コンストラクタ。 |
@Target(ElementType.LOCAL_VARIABLE) |
ローカル変数。 |
@Target(ElementType.ANNOTATION_TYPE) |
アノテーション型。 |
@Inherited
アノテーション情報をサブクラスにも継承できるかどうか。
アノテーション属性
@interface命令の下には、アノテーションで使用できる属性を指定する。属性は抽象メソッドのように、型と名前のセットで表す。
このように定義された属性は、一般的に@アノテーション名(属性名=値, ...)の形式で指定できる。ただし、属性名がvalueの場合は名前を省略し、@アノテーション名(値)のように書くこともできる。
例えば、次はVersionアノテーションを指定するannotationTestメソッドの例である。
AnnotationSample.java
package com.example.mynavi.object;
public class AnnotationSample {
@Version(1.0)
public void annotationTest() {
System.out.println("Released");
}
}