Javaで自作アノテーションを作成し、アノテーションの値を取得するサンプルプログラムを紹介します。
環境
- jdk1.8.0_231
C:\>java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
C:\>
1. 自作アノテーションを作成
自作アノテーションのサンプルです。ここではメンバに「name」と「value」を持たせています。
package test01;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) // (1) @Retantionでアノテーション情報をどの段階まで保持するかを制御
@Target({ // (2) @Targetどのようなタイプの要素に対して、そのアノテーションを付加できるのかを制御
ElementType.TYPE,
ElementType.FIELD,
ElementType.CONSTRUCTOR,
ElementType.METHOD
})
public @interface MyAnnotation { // (3) MyAnnotationを作成
String name();
int value() default 0;
}
(1) の@Retentionでアノテーション情報をどの段階まで保持するかを指定します。
@Retentionには主に以下を設定することができます。
| 値 | 説明 |
|---|---|
| RetentionPolicy.SOURCE | アノテーションはソースレベルでのみ保持され、コンパイラによって無視されます。 |
| RetentionPolicy.CLASS | アノテーションはコンパイル時にコンパイラーによって保持されますが、Java仮想マシン(JVM)によって無視されます。 |
| RetentionPolicy.RUNTIME | アノテーションはJVMによって保持されるため、ランタイム環境で使用できます。 |
ここではRetentionPolicy.RUNTIMEを指定します。
(2) の@Targetでアノテーションを適用可能な場所を指定します。
@Targetには主に以下を設定することができます。
| 値 | 説明 |
|---|---|
| ElementType.TYPE | クラス、インターフェース、アノテーション、enum型に適用可能にします。 |
| ElementType.FIELD | フィールドに適用可能にします。 |
| ElementType.CONSTRUCTOR | コンストラクタに適用可能にします。 |
| ElementType.METHOD | メソッドに適用可能にします。 |
ここでは@TargetにElementType.TYPE、ElementType.FIELD、ElementType.CONSTRUCTOR、ElementType.METHODを指定します。
(3) でMyAnnotationの名前でアノテーションを作成します。メンバにnameとvalueを設定します。
2. クラスにアノテーションを付与
Sampleクラスのクラス、フィールド、コンストラクタ、メソッドに自作のMyAnnotationを付与します。
package test01;
@MyAnnotation(name="class", value=100) // (1) クラスにMyAnnotationを付与
public class Sample {
@MyAnnotation(name="field", value=200) // (2) フィールドにMyAnnotationを付与
private String name;
@MyAnnotation(name="constructor", value=300) // (3) コンストラクタにMyAnnotationを付与
public Sample() {}
@MyAnnotation(name="method", value=400) // (4) メソッドにMyAnnotationを付与
public void execute() {
System.out.println("execute");
}
}
(1) クラスに自作アノテーション(MyAnnotation)を付与します。
(2) フィールドに自作アノテーション(MyAnnotation)を付与します。
(3) コンストラクタに自作アノテーション(MyAnnotation)を付与します。
(4) メソッドに自作アノテーション(MyAnnotation)を付与します。
3. アノテーションを取得して参照
package test01;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args)
throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, SecurityException {
// (1) クラスについているアノテーション(MyAnnotation)を取得
Class<?> clazz = Class.forName("test01.Sample");
MyAnnotation annoClass = (MyAnnotation) clazz.getAnnotation(MyAnnotation.class);
System.out.println("class annotation : name=" + annoClass.name() + ", value=" + annoClass.value());
// (2) フィールドについているアノテーション(MyAnnotation)を取得
Field field = clazz.getDeclaredField("name");
MyAnnotation annoField = (MyAnnotation) field.getAnnotation(MyAnnotation.class);
System.out.println("field annotation : name=" + annoField.name() + ", value=" + annoField.value());
// (3) コンストラクタについているアノテーション(MyAnnotation)を取得
Constructor<?> cons = clazz.getConstructor();
MyAnnotation annoCons = (MyAnnotation) cons.getAnnotation(MyAnnotation.class);
System.out.println("constructor annotation : name=" + annoCons.name() + ", value=" + annoCons.value());
// (4) メソッドについているアノテーション(MyAnnotation)を取得
Method method = clazz.getMethod("execute");
MyAnnotation annoMethod = (MyAnnotation) method.getAnnotation(MyAnnotation.class);
System.out.println("method annotation : name=" + annoMethod.name() + ", value=" + annoMethod.value());
}
}
(1) Sampleクラスに付いているアノテーション(MyAnnotation)の内容を取得し表示します。
(2) Sampleクラスのフィールドnameに付いているアノテーション(MyAnnotation)の内容を取得し表示します。
(3) Sampleクラスのコンストラクタに付いているアノテーション(MyAnnotation)の内容を取得し表示します。
(4) Sampleクラスのexecuteメソッドに付いているアノテーション(MyAnnotation)の内容を取得し表示します。
参考
Lesson: Annotations (The Java™ Tutorials < Learning the Java Language)
以上