Posted at

アノテーションを自作してみる。

More than 5 years have passed since last update.

カスタムクラスローダを作ってみるに引き続き、リフレクションとかで遊ぶ。アノテーションでなんかしてみる。


MyAnnotation.java

import java.lang.reflect.Method;

import java.lang.annotation.Annotation;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

public class MyAnnotation {
public static void main(String[] args) {
Class clazz = MyAnnotation.class;
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
try {
Annotation[] annotations = method.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
if (annotation.annotationType().equals(CallMe.class)) {
method.invoke(null);
}
}
} catch (Exception e) { // nice catch!
}
}
}

@CallMe
static void test1() {
System.out.println("call test1");
}

static void test2() {
System.out.println("call test2");
}

@CallMe
static void test3() {
System.out.println("call test3");
}
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface CallMe {
}

Classオブジェクトから@CallMeアノテーションのついているstaticメソッドだけ呼び出し。


実行結果

$ java MyAnnotation 

call test1
call test3

@CallMeをつけたメソッドtest1, test3メソッドだけ呼ばれてますね。


参考サイト