こんにちは。「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が返却されています。