(1) 自作アノテーションの作成~使用の手順
(1-1) アノテーションの宣言
(1-2) メタアノテーションの追加(任意)
(1-3) アノテーションを実際に使う(注釈の付与)
(1-4) アノテーションの情報を集めて呼び出す(注釈データの取得)
(2) サンプルプログラム
(1) 自作アノテーションの作成~使用の手順
アノテーションは自作する事が出来るので、そのステップを順を追ってご紹介します。
今回の例は「アノテーションの種類」のうちの「複数値アノテーション」の例になります。
(1-1) アノテーションの宣言
著者の情報(名前、年齢、テーマカラー)の注釈
//####(1-2)アノテーション本体の定義
@interface AuthorInfo {
public enum AuthorColor {RED,BLUE,GREEN}
String Author() default "Rainbow";
int AuthorAge() default 18;
AuthorColor Color() default AuthorColor.RED;
}
(1-2) メタアノテーションの追加(任意)
(表)4種類のメタアノテーション
| @Documented | 指定したアノテーションをJavaDocに含めます。 |
| @Retention | アノテーションが利用可能なタイミングを指定します。
■取り得る値 |
| @Target | アノテーションを配置出来る範囲を指定します。指定する値は「java.lang.annotation.ElementType」enumの以下要素から選択できます。 ■取り得る値 ①ElementType.TYPE ⇒Class,Interface,Enumに使用 ②ElementType.FIELD ⇒インスタンス変数、Enum定数 ③ElementType.METHOD ④ElementType.PARAMETER ⇒ジェネリック型パラメータ(Java8~) ⑤ElementType.CONSTRUCTOR ⑥ElementType.LOCAL_VARIABLE ⑦ElementType.ANNOTATION_TYPE ⑧ElementType.PACKAGE ■使用例 |
| @Inherited | サブクラスがアノテーションを利用できるかの設定 |
(STEP#2)
//##(1)カスタムアノテーションの定義
//####(1-1)メタアノテーションの追加
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
//####(1-2)アノテーション本体の定義
@interface AuthorInfo {
public enum AuthorColor {RED,BLUE,GREEN}
String Author() default "Rainbow";
int AuthorAge() default 18;
AuthorColor Color() default AuthorColor.RED;
}
ここまでで自作アノテーションの作成は完了です。
次の節では実際にアノテーションを使用していき、最終的には使用したアノテーションのメンバ変数情報を取得する流れをご紹介します。
(1-3) アノテーションを実際に使う(注釈の付与)
今回の例ではターゲット(@Target)にて「@Target(ElementType.METHOD)」を指定しているので、メソッドに対してアノテーションを使用する形になります。クラス「UseCustomeAnnotation」クラス内にメソッド「sample」を定義して、それに対してアノテーションを付けています。
(STEP#3)
class UseCustomAnnotation {
//###(2)カスタムアノテーションの使用
@AuthorInfo(Author="Rainbow",Color=AuthorInfo.AuthorColor.BLUE)
public void sample() {
System.out.println("Your custom annotation is used now");
}
}
(1-4) アノテーションの情報を集めて呼び出す(注釈データの取得)
最後に使用したアノテーションの情報を集めて出力してみます。これには「リフレクション」と呼ばれるクラスのメタデータを取得するためのAPI群を用いて、アノテーションの情報を取得していきます。
(STEP#4)
//(3-1)自作アノテーションクラスのインスタンス生成
[自作アノテーションクラス名] uca = new [自作アノテーションクラス名]();
//(3-2)リフレクションのMethodクラスにより、アノテーションを付けたメソッドの情報を取得
Method m = uca.getClass().getMethod("sample");
//(3-3)メソッドオブジェクトから自作アノテーションの情報を取得
[自作アノテーションクラス] td = m.getAnnotation([自作アノテーションクラス].class);
(2) サンプルプログラム
(サンプルプログラム)
上記のSTEP#1~STEP#4までを全てまとめて実装したサンプルプログラムが以下です。
package studyc;
import java.lang.annotation.*;
import java.lang.reflect.Method;
//##(1)カスタムアノテーションの定義
//####(1-1)メタアノテーションの追加
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
//####(1-2)アノテーション本体の定義
@interface AuthorInfo {
public enum AuthorColor {RED,BLUE,GREEN}
String Author() default "Rainbow";
int AuthorAge() default 18;
AuthorColor Color() default AuthorColor.RED;
}
class UseCustomAnnotation {
//###(2)カスタムアノテーションの使用
@AuthorInfo(Author="Rainbow",Color=AuthorInfo.AuthorColor.BLUE)
public void sample() {
System.out.println("Your custom annotation is used now");
}
}
public class FetchAnnotationInfo {
//###(3)カスタムアノテーションの呼び出し
public static void main(String args[]) throws Exception {
//(3-1)自作アノテーションクラスのインスタンス生成
UseCustomAnnotation uca = new UseCustomAnnotation();
//(3-2)リフレクションのMethodクラスにより、アノテーションを付けたメソッドの情報を取得
Method m = uca.getClass().getMethod("sample");
//(3-3)メソッドオブジェクトから自作アノテーションの情報を取得
AuthorInfo td = m.getAnnotation(AuthorInfo.class);
//(3-4)アノテーションの情報をコンソール出力
System.out.println("author is "+td.Author());
System.out.println("author age is "+td.AuthorAge());
System.out.println("priority is "+td.Color());
}
}
(実行結果)
・AuthorAgeはデフォルトの18が表示されています。
・AuthorColorは注釈使用時に与えた「BLUE」が出力されています。
