(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」が出力されています。