読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

アノテーションの利用(2)

Java

今回はアノテーションを実行時に取得する方法をまとめる


まずはアノテーションを作成する

package sample.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface SampleAnnotation {
    public String value();
}

今回は実行時に取得するため@RetentioはRUNTIMEを指定

@Targetは未指定だからアノテーションが指定できるところならどこでも指定できる


次にさっきのアノテーションを使用したクラスを作成する

package sample.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args) {

        Class<Test> clazz = Test.class;

        // クラス
        log(clazz.getAnnotations());

        // コンストラクタ
        Constructor[] constructors = clazz.getConstructors();
        log(constructors[0].getAnnotations());

        // フィールド
        Field[] fields = clazz.getFields();
        log(fields[0].getAnnotations());

        // メソッド
        Method[] methods = clazz.getMethods();
        log(methods[0].getAnnotations());

        // パラメーター
        Annotation[][] params = methods[0].getParameterAnnotations();
        log(params[0]);

        // ローカル変数
        // どうやって取得するの・・・?

    }

    public static void log(Annotation[] annotations) {

        for (Annotation annotation: annotations) {
            System.out.println(annotation);
        }
    }
}

これを実行するとアノテーションの情報が出力されるようになる

@sample.annotation.SampleAnnotation(value=クラス)
@sample.annotation.SampleAnnotation(value=コンストラクタ)
@sample.annotation.SampleAnnotation(value=フィールド)
@sample.annotation.SampleAnnotation(value=メソッド)
@sample.annotation.SampleAnnotation(value=パラメーター)

これは単純にリフレクションの機能からアノテーションを取得している

でも、ローカル変数の取得方法が分かんない


アノテーションの固有情報を取得するには次のようにする

for (Annotation annotation: annotations) {
    if (annotation instanceof SampleAnnotation) {
        SampleAnnotation sampleAnnotation = (SampleAnnotation)annotation;
        System.out.println("value=" + sampleAnnotation.value());
    }
}

アノテーションの型をチェックしてキャストしてあげることで固有の値だけが取得できるようになる

value=クラス
value=コンストラクタ
value=フィールド
value=メソッド
value=パラメーター


今回は実行時にアノテーションを取得する方法まとめてみた


前回書いた「Pluggable Annotation Processing API」とは違って

リフレクションの機能を使うだけだからコレはそんなに難しい感じではないかなぁ


次はコンパイル時のアノテーションの取得をやろうと思う

「Pluggable Annotation Processing API」はコンパイル時に使うAPIだと思ってるけど合ってるかなぁ・・・
(誰か教えて)


少し見てみたけどかなり複雑だからオレが理解できるか心配・・・