Java 独自のアノテーションで値を取得するサンプル

Javaの独自のアノテーションを作成して値を取得するサンプルです。

目次

サンプル 1.独自のアノテーションを作成する
  2.クラスにアノテーションを付ける
  3.メソッドにアノテーションを付ける
  独自のアノテーション

1.独自のアノテーションを作成する

独自のアノテーションです。値の設定と取得ができます。

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.METHOD 
})
public @interface TestAnnotation1 {
	String version() default "1";
	String author();
}

8行目の@Retentionは、アノテーションを保持する範囲です。
RetentionPolicy.RUNTIMEは、アプリケーション実行時に値を取得します。
10行目の@Targetは、アノテーションを適用する場所です。クラスとメソッドです。
14行目は、TestAnnotation1というアノテーションです。

2.クラスにアノテーションを付ける

public <A extends Annotation> A getAnnotation(Class<A> annotationClass)

クラスに1で作成したアノテーションを付けるサンプルです。

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行目は、クラスにアノテーションを付けています。
12行目は、アノテーションの値を取得するためにリフレクションを使用しています。
14行目は、getAnnotationメソッドでアノテーションを取得しています。
16,19行目は取得したアノテーションの値をif文で判定しています。

3.メソッドにアノテーションを付ける

public Method getMethod(String name,Class<?>... parameterTypes)
throws NoSuchMethodException,SecurityException

メソッドに1で作成したアノテーションを付けるサンプルです。

package test1;

import java.lang.reflect.Method;

class Sample1 {
	@TestAnnotation1 (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[] {});
		
		TestAnnotation1 b1 =
		(TestAnnotation1) method.getAnnotation(TestAnnotation1.class);

		if(b1.version().equals("2.01")) {
			System.out.println("2.01です"); //2.01です
		}
		if(b1.author().equals("jiro")) {
			System.out.println("jiroです"); //jiroです
		}
	}
}

6行目は、メソッドにアノテーションを付けています。
14-25行目は、アノテーションの値を取得するためにリフレクションを使用しています。
18行目は、getAnnotationメソッドでアノテーションを取得しています。
20,23行目は取得したアノテーションの値をif文で判定しています。

独自のアノテーション

public @interface アノテーション名{
}

作成するアノテーション名の前に@interfaceをつけます。

 

@Retention(アノテーションを保持する範囲)

@Retantionの引数は、アノテーションを保持する範囲です。

説明
RetentionPolicy.RUNTIME アノテーションを実行時も保持します。リフレクションを使うとアノテーションの情報を取得できます。
RetentionPolicy.CLASS アノテーションはクラスファイルに保持されますが実行時には保持されません。@Retentionがない場合は、この値がデフォルトです。
RetentionPolicy.SOURCE アノテーションはソースファイルに保持されますがクラスファイルには保持されません。

 

@Target(アノテーションを適用する場所)

@Targetの引数は、アノテーションを適用する場所です。

説明
ElementType.TYPE クラス、インターフェース、アノテーション、enum型に適用します。
ElementType.FIELD フィールドに適用します。
ElementType.CONSTRUCTOR コンストラクタに適用します。
ElementType.METHOD メソッドに適用します。

以下は、Java8 API仕様のAnnotation Typesのリンクです。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6

関連の記事

Java 標準アノテーションのサンプル
Java リフレクションのサンプル

△上に戻る