java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

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

投稿日:

最終更新日:2016年10月02日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

今回はリフレクションを使って、フィールドにアノテーションが付与されているか調べる方法を確認しました。

自作する

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

MyAnnotation

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

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

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

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

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

TestDto

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が返却されています。