アットウィキロゴ

annotation

基本
アノテーションは以下のキーワードで定義できる。

@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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。