Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

Javaのアノテーションを自作する方法をご紹介(サンプルプログラム付き)

投稿日:2020年12月6日 更新日:

(1) 自作アノテーションの作成~使用の手順
 (1-1) アノテーションの宣言
 (1-2) メタアノテーションの追加(任意)
 (1-3) アノテーションを実際に使う(注釈の付与)
 (1-4) アノテーションの情報を集めて呼び出す(注釈データの取得)
(2) サンプルプログラム

(1) 自作アノテーションの作成~使用の手順

アノテーションは自作する事が出来るので、そのステップを順を追ってご紹介します。
今回の例は「アノテーションの種類」のうちの「複数値アノテーション」の例になります。

(1-1) アノテーションの宣言

カスタムのアノテーションの宣言は「@interface」の後ろに「アノテーション名」を記述する事で行えます。アノテーション内ではメソッドの「シグニチャ」(「メソッド名」と「戻り値の型」のみ)を持つことが出来るため、インターフェイスに似ています。
全てのアノテーションは「java.lang.annotation.Annotation」インタフェイスを継承していますが、アノテーション内には「extends」句は記述しません。
 
(STEP#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) メタアノテーションの追加(任意)

次に「メタアノテーション」の追加を行います。メタアノテーションは「java.lang.annotation」パッケージにて提供されるアノテーションで、「アノテーションを作る時」にのみ利用される特殊なアノテーションです。

以下の4種類があり、主には自作アノテーションの「使用範囲」や「発効タイミング」といったアノテーションの特性を決定するものです。

(表)4種類のメタアノテーション

@Documented 指定したアノテーションをJavaDocに含めます。
@Retention アノテーションが利用可能なタイミングを指定します。

■取り得る値
SOURCE ⇒コンパイル時に破棄(.classには含まれない)
CLASS ⇒クラスロード時に破棄(.classには含まれるがJVM:ランタイムには無効)
RUNTIME ⇒破棄しない(JVM:ランタイムも保持される)

@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

■使用例
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD}) 
@interface MyAnnotation{ 
int value1(); 
String value2(); 

@Inherited サブクラスがアノテーションを利用できるかの設定

(STEP#2)

@Target(ElementType.METHOD)でメソッドに対して自作アノテーションを付与できるようにしています。また@Retention(RetentionPolicy.RUNTIME)でランタイム(実行時)にも有効にしています。

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

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

「Graphics Device initialization failed for : es2, sw」エラーの原因と対処方法(Java FX関連)

  <目次> (1) 「Graphics Device initialization failed for : es2, sw」エラーの原因と対処方法(Java FX関連)  (1-1) エ …

Javaで複数の配列を結合する方法について

<目次> (1) Javaで複数の配列を結合する方法について  (1-1) 構文  (1-2) サンプルプログラム (1) Javaで複数の配列を結合する方法について Javaで複数の配列を結合する方 …

Javaのenumとは?使い方や意味を様々な利用シーンでご紹介(if、for、switch他)

<目次> (1) Javaのenumとは?意味や用途を様々な利用シーンでご紹介   (1-1) enumとは?  (1-2) 構文(enumの定義)  (1-3) 様々なenumの使用例 (1) Ja …

「サーブレットコンテナ」や「サーブレットのライフサイクル」とは?(サンプルプログラム付)

※本記事は「サーブレットとは?その役割やHelloWorldサンプルコードのご紹介」の続編です。 (0)目次&概説 (2) サーブレットコンテナの基本  (2-1) サーブレットコンテナとは?  (2 …

JavaのMapの種類や特徴について(HashMap/LinkedHashMap/TreeMap)

<目次> (1) JavaのMapの種類や特徴について(HashMap/LinkedHashMap/TreeMap)  (1-1) Mapとは?  (1-2) Mapの種類や特徴   (1-2-1) …

  • English (United States)
  • 日本語
Top