基本
アノテーションは以下のキーワードで定義できる。
@Retantion(RetantionType.RUNTIME);
@Target(ElementType.TYPE)
public @interface SomeAnnotation{
public String value() default "";
public AnnotationType anoType();
public AnnotationChildren[] children();
}
[[enum]] AnnotationType{FOO,BAR,BAZ);
基本はインタフェースとして定義するが、振る舞いは保有できず値のみ定義。値は、保有する型を戻り値にする感じで定義。defaultというキーワードを使い、デフォルト地を定義できる。ちなみにAnnotationの属性として保有できるのは、文字列・数値・クラス・アノテーションの配列。
RetantionやTargetはAnnotationに対してつけるメタアノテーション。ちなみにメタアノテーションは自分でも定義可能なり。
アノテーションを実行時に調べる
リフレクションで可能。
Field[] fields = clazz.getFields();
for(Field field : fields){
field.setAccessible(true);
Annotation[] annotations = field.getAnnotations();
for(Annotation anno : annotations){
if(anno.annotationType().equals(SomeAnnotation.class)){
SomeAnnotation someAnno = (SomeAnnotation)anno;
...
}
}
}
ちなみにアノテーションの方を知りたいときにgetClassをやるとうまくいかない。
動的プロキシを使っているので、getClassではProxy型が帰ってきてしまう。困ったものだ。
ということで、実行時にアノテーションを捕まえることは結構簡単。
なのでEJBなどのインジェクションとか、EJBレベルのアスペクトは比較的簡単に実装できるね!
…つーことで、自分の勉強をかねて超簡単DIコンテナを組んでみました。以下参照。
easydi
最終更新:2008年10月05日 19:30