こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

リフレクションでフィールドのアノテーションの有無を調べる

こんにちは。「Javaを復習する初心者」です。今回はリフレクションを使って、フィールドにアノテーションが付与されているか調べる方法を確認しました。

自作する

既存のアノテーションを使おうとおもいましたが、自作した方が早いと思い、アノテーションを定義するjavaファイルを作りました。マーカーとしての役割のみを持つアノテーションをを以下のように作りました。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}

「@interface」でアノテーションの定義になるようです。「@Retention(RetentionPolicy.RUNTIME)」はアノテーションの付与を調べるときに必要になるようです。リフレクションの機能を使うのですが、この記述がないとうまく動作しませんでした。

アノテーションを付与する

今回はアノテーションの有無を調べるためのクラスを以下のようにprivateフィールドのみを持つクラスを作りました。フィールドを2つだけ持ち、ひとつは上記のアノテーションを付与しています。

public class TestDto {

    @MyAnnotation
    private String name;
    
    private String age;

}

上記クラスに対して、フィールドname、ageそれぞれについて、アノテーションが付与されているかを判定するプログラムを書きました。以下のソースです。

        System.out.println("MyAnnotationアノテーションの有無");

        Class<MyAnnotation> clazz = MyAnnotation.class;
        Field field;
        String fieldName;

        fieldName = "name";
        field = TestDto.class.getDeclaredField(fieldName);
        System.out.println(fieldName + ": " + field.isAnnotationPresent(clazz));

        fieldName = "age";
        field = TestDto.class.getDeclaredField(fieldName);
        System.out.println(fieldName + ": " + field.isAnnotationPresent(clazz));

アノテーションが付与されているかはリフレクションの機能を使います。最初にClassクラスを宣言してますが、これはリフレクションで使用するためです。フィールドにアノテーションの付与されているかを調べるため、Fieldクラスを宣言しています。これはTestDto.class.getDeclaredFieldの結果を格納するための変数です。アノテーション有無はFieldクラスのisAnnotationPresentメソッドで調べることができます。引数は対象のアノテーションに対するClassクラスのインスタンスです。今回は最初に宣言した変数clazzを指定しています。isAnnotationPresentメソッドがtrueを返すのは引数に指定したアノテーションがフィールドに付与されている場合なのですが、そのアノテーションに@Retention(RetentionPolicy.RUNTIME)が付与されている必要があるようです。

以下は実行結果です。

MyAnnotationアノテーションの有無
name: true
age: false

フィールド「name」の場合に、trueが返却されています。