アノテーションを使ってみる
いかんねむいのでとりあえずメモ。
ちょっとアヤしいことをするために、フィールドにアノテーションを付けます。
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 { ... }