アノテーションのインスタンスの作り方
アノテーションAnnoのオブジェクトは@Annoが付与されているクラスやメソッドに対応するClassやMethodオブジェクトについてAnnotatedElement#getAnnotation(Anno.class)を呼び出すことで取得できるが、新たに生成したいことがある(かもしれない)。
そこでいろいろ試してみた。
まずこれ。
Anno anno = Anno.class.newInstance();
これはあえなくInstantiationException。
んで次はこれ。
Constructor<?>[] constructors = Anno.class.getConstructors();
System.out.println(constructors.length);この結果は「0」。そもそもコンストラクタがないのね…。
アノテーションの実体はインターフェースなので、Proxyを使えばインスタンスを作成できます。
package examples.main; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class AnnotationExample { public static void main(String[] args) { Retention retention = (Retention) Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), new Class[] { Retention.class }, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("annotationType")) { return Retention.class; } else if (method.getName().equals("value")) { return RetentionPolicy.RUNTIME; } return null; } }); System.out.println(retention.annotationType()); System.out.println(retention.value()); } }