Help us understand the problem. What is going on with this article?

Java リフレクションとアノテーションを組み合わせて使用する

More than 5 years have passed since last update.

自作のAnnotationをReflectionで引っ掛けてゴニョゴニョしようとする場合、
@Retentionの設定が必要です。

@Retentionの設定は下記の三種類があります。

■ RetentionPolicy.RUNTIME
classファイルに記録され実行時に参照できる。
■ RetentionPolicy.CLASS
classファイルに記録されるが実行時には保持されない。(default)
■ RetentionPolicy.SOURCE
コンパイル時に破棄される。

よって、上記のような使い方をしたい場合はRetentionPolicy.RUNTIMEで
設定してあげれば正しい動作をしてくれます。
その他の設定にしていた場合、f.getAnnotation(CustomAnnotation.class)の結果がnullになります。

CustomAnnotation.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CustomAnnotation {
    public String value();
}

Hoge.java
public class Hoge {
    @CustomAnnotation("a")
    private String name;

    @CustomAnnotation("b")
    private int value;

    /** ~中略~ */
}

ReflectionUtil.java
public class ReflectionUtil{

     public static void output(Object obj){
         if(obj == null){
            return null;
         }

         Field[] fieldList = obj.getClass().getDeclaredFields();

         for (Field f: fieldList) {
                f.setAccessible(true);
                String name     = f.getName();
                Object fieldObj = f.get(obj);

                // RetentionPolicy.RUNTIME以外はここがnullになります。
                if(f.getAnnotation(CustomAnnotation.class) != null){
                        CustomAnnotation element = 
                                      f.getAnnotation(CustomAnnotation.class);
                        System.out.println(element.value());
                }
         }
     }

}

Main.java
public class TestMain {

        public static void main(String[] args) {
             Hoge h = new Hoge();
             ReflectionUtil.output(h);
        }
}

まあ、初歩的な事なんだけど、メモ的に記録しておこう。

kuuki_yomenaio
元々サーバサイドを得意としていますが、 クライアントもやります。 ゲーム開発のお仕事をしています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした