1.概要

2.アノテーション

@Override

@Retention(RetentionPolicy.RUNTIME)
public @interface Greeter {
    public String greet() default "";
}

@Greeter(greet="Good morning")
public class Greetings {}

それでは、リフレクションを使用してアノテーション値にアクセスします。 Javaクラス

Class

は、クラスの注釈にアクセスするためのメソッド

getAnnotation

を提供します。

Greeter greetings = Greetings.class.getAnnotation(Greeter.class);
System.out.println("Hello there, " + greetings.greet() + " !!");

=== 3.注釈を変更する

Map<Class<? extends Annotation>, Annotation> map;

このマップにアクセスする方法は、さまざまなJDK実装で異なります。 JDK 7とJDK 8について説明します。


3.1.


JDK 7の実装





_has field




_

Field annotations = Class.class.getDeclaredField(ANNOTATIONS);
annotations.setAccessible(true);

それでは、クラス

Greeter

のアノテーションマップにアクセスしましょう。

 Map<Class<? extends Annotation>, Annotation> map = annotations.get(targetClass);

map.put(targetAnnotation, targetValue);


3.2.


JDK 8の実装

Method method = Class.class.getDeclaredMethod(ANNOTATION__METHOD, null);
method.setAccessible(true);

Field annotations = annotationData.getClass().getDeclaredField(ANNOTATIONS);
annotations.setAccessible(true);

Map<Class<? extends Annotation>, Annotation> map = annotations.get(annotationData);
map.put(targetAnnotation, targetValue);

=== 4.申し込み

この例を見てみましょう:

Greeter greetings = Greetings.class.getAnnotation(Greeter.class);
System.err.println("Hello there, " + greetings.greet() + " !!");

これは「おはよう」という挨拶になるでしょう。それが私たちがアノテーションに提供した価値だからです。それでは、値が「こんばんは」として

Greeter

タイプのオブジェクトをもう1つ作成します。

Greeter targetValue = new DynamicGreeter("Good evening");

アノテーションマップを新しい値で更新しましょう。

alterAnnotationValueJDK8(Greetings.class, Greeter.class, targetValue);

あいさつの値をもう一度確認しましょう。

greetings = Greetings.class.getAnnotation(Greeter.class);
System.err.println("Hello there, " + greetings.greet() + " !!");

「こんばんは」と挨拶します。

=== 5.まとめ

そして、いつものように、実装のソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-lang[over on Github]から入手できます。