アノテーションを使ってみる

いかんねむいのでとりあえずメモ。
ちょっとアヤしいことをするために、フィールドにアノテーションを付けます。

public @interface FooBar {
  String name();
  boolean checked() default false;
}

こんなかんじにします。

public class A {
  @FooBar(name = "abc")
  protected Object foo;

  @FooBar(name = "def", checked = true)
  protected Object foo;

}

こんどは取得してみる。
Class から Field をとって getAnnotations() とかで取得可能。

  Annotation[] annos = field.getAnnotations();
  // annos[0] に FooBar アノテーションがあるとします。
  FooBar fooBar = (FooBar)annos[0];
  String name = fooBar.name();
  boolean checked = fooBar.checked();

ところが、これが意外とうまくいかない、というか、アノテーションを全く取れなかったんですね。
調べた結果、アノテーションはソースレベルでしか保持しない、クラスファイルレベルまで保持、ランタイムレベルまで保持、とリテンションは三段階になっています。ランタイムまで持たせなかったためにうまくいかなかったと。
次のようにしたらランタイムでもアノテーションを維持しました。

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

@Retention(RetentionPolicy.RUNTIME)
public @interface FooBar {
  ...
}