Javaの独自のアノテーションを作成して値を取得するサンプルです。
目次
独自のアノテーション
| @Retention(アノテーションを保持する範囲) @Target(アノテーションを適用する場所) public @interface アノテーション名{ } |
- @Retantionの引数は、アノテーションを保持する範囲です。
| 値 | 説明 |
|---|---|
| RetentionPolicy.RUNTIME | アノテーションを実行時も保持します。リフレクションを使うとアノテーションの情報を取得できます。 |
| RetentionPolicy.CLASS | アノテーションはクラスファイルに保持されますが実行時には保持されません。@Retentionがない場合は、この値がデフォルトです。 |
| RetentionPolicy.SOURCE | アノテーションはソースファイルに保持されますがクラスファイルには保持されません。 |
- @Targetの引数は、アノテーションを適用する場所です。
| 値 | 説明 |
|---|---|
| ElementType.TYPE | クラス、インターフェース、アノテーション、enum型に適用します。 |
| ElementType.FIELD | フィールドに適用します。 |
| ElementType.CONSTRUCTOR | コンストラクタに適用します。 |
| ElementType.METHOD | メソッドに適用します。 |
- 作成するアノテーション名の前に@interfaceをつけます。
- 以下は、Java8 API仕様のAnnotation Typesのリンクです。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6
以下、3つのサンプルがあります。
1.独自のアノテーションを作成する
2.1で作成したアノテーションをクラスに付ける
3.1で作成したアノテーションをメソッドに付ける
1.独自のアノテーションを作成する
アノテーションの内容は、値の設定と取得ができるものです。取得した値はif文で使用できます。
8行目の@Retentionは、アノテーションを保持する範囲です。アプリケーション実行時に値を取得したいので引数はRetentionPolicy.RUNTIMEにしています。
10行目の@Targetは、アノテーションを適用する場所です。今回のサンプルはクラスとメソッドのみなのでElementType.TYPEとElementType.METHODのみでもいいです。
16行目は、TestAnnotation1というアノテーションです。
package test1;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.TYPE,
ElementType.FIELD,
ElementType.CONSTRUCTOR,
ElementType.METHOD
})
public @interface TestAnnotation1 {
String version() default "1";
String author();
}
2.1で作成したアノテーションをクラスに付ける
1で作成したアノテーションをクラスに付けるサンプルです。
3行目でクラスにアノテーションを付けています。
12-21行目は、アノテーションの値を取得するためにリフレクションを使用しています。
Java リフレクションのサンプル
14行目は、getAnnotationメソッドでアノテーションを取得しています。
16,19行目は取得したアノテーションの値をif文で判定しています。
package test1;
@TestAnnotation1(version = "1.05", author = "taro")
class Sample1 {
public void print() {
System.out.println("test");
}
}
public class Test1 {
public static void main(String[] args) throws Exception {
Class<?> c1 = Class.forName("test1.Sample1");
TestAnnotation1 a1 =
(TestAnnotation1)c1.getAnnotation(TestAnnotation1.class);
if(a1.version().equals("1.05")) {
System.out.println("1.05です"); //1.05です
}
if(a1.author().equals("taro")) {
System.out.println("taroです"); //taroです
}
}
}
3.1で作成したアノテーションをメソッドに付ける
1で作成したアノテーションをメソッドに付けるサンプルです。
6行目でメソッドにアノテーションを付けています。
14-25行目は、アノテーションの値を取得するためにリフレクションを使用しています。
Java リフレクションのサンプル
18行目は、getAnnotationメソッドでアノテーションを取得しています。
20,23行目は取得したアノテーションの値をif文で判定しています。
package test1;
import java.lang.reflect.Method;
class Sample1 {
@TestA1(version = "2.01", author = "jiro")
public void print() {
System.out.println("test");
}
}
public class Test1 {
public static void main(String[] args) throws Exception {
Class<?> c1 = Class.forName("test1.Sample1");
Method method = c1.getMethod("print", new Class[] {});
TestA1 b1 =
(TestA1) method.getAnnotation(TestA1.class);
if(b1.version().equals("2.01")) {
System.out.println("2.01です"); //2.01です
}
if(b1.author().equals("jiro")) {
System.out.println("jiroです"); //jiroです
}
}
}
関連の記事