「Java」アノテーションの情報取得

あまり気にすることなく使ってたアノテーション。ちょっと調べてみようということで、独自アノテーション作って、クラス、メソッドに設定されたアノテーションの情報取得してみるってあたりをやってみました。その時のメモです。

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

■ TypeAnnoTest.java

package test;

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)
public @interface TypeAnnoTest {
}

■ MethodAnnoTest.java

package test;

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.METHOD)
public @interface MethodAnnoTest {
}

何の情報も持たないアノテーションを作った。


2. 独自アノテーションを使う、および、アノテーションの情報を取得するプログラム

package run;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import test.MethodAnnoTest;
import test.TypeAnnoTest;

public class AnnoTest {

	public static void main(String[] args) throws NoSuchMethodException,
			InvocationTargetException, IllegalAccessException {
		Class<AnnoTest> c1 = AnnoTest.class;
		Method m1 = c1.getMethod("method1", null);
		// m1.invoke(new AnnoTest(), null);
		Annotation[] a1 = m1.getAnnotations();
		for(Annotation aa : a1) {
			System.out.println(aa);
		}
		
		Class<Test> c2 = Test.class;
		// Method m2 = c2.getMethod("method2", null);
		// m2.invoke(new Test(), null);
		Annotation[] a2 = c2.getAnnotations();
		for(Annotation aa : a2) {
			System.out.println(aa);
		}
	}

	@MethodAnnoTest
	public void method1() {
		System.out.println("method1");
	}
}

@TypeAnnoTest
class Test {
	public void method2() {
		System.out.println("method2");
	}
}


上記の AnnoTest.java 実行すると、以下の出力が得られる。

@test.MethodAnnoTest()
@test.TypeAnnoTest()

クラス、メソッドに定義したアノテーションの情報が取得できております。

目的が微妙でだいぶとイマイチ感ありますが、以上です。


アノテーションは、以下の Web ページを参考にさせていただきました。

・【改訂版】Eclipseではじめるプログラミング(22):いまさら聞けない「Javadoc」と「アノテーション」入門 (1/4) - @IT
http://www.atmarkit.co.jp/ait/articles/1105/19/news127.html