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");
    }
}