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

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

目次

サンプル 独自のアノテーションの作り方
1.独自のアノテーションのサンプル
  2.1のアノテーションをクラスに付ける
  3.1のアノテーションをメソッドに付ける

独自のアノテーションの作り方

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

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

 

2.アノテーションを保持する範囲を指定します。

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

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

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

 

3.アノテーションを適用する場所を指定します。

@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

 

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.1のアノテーションをクラスに付ける

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.1のアノテーションをメソッドに付ける

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文で判定しています。

関連の記事

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

△上に戻る