[seasar-dev:655] Re: AOPをかけた後にAnnotationを読むには

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 3月 9日 (金) 04:00:22 JST


小林 (koichik) です.

Date:    Fri, 9 Mar 2007 02:52:23 +0900
From:    加藤 潤一 <[E-MAIL ADDRESS DELETED]>
To:      "[E-MAIL ADDRESS DELETED]" <[E-MAIL ADDRESS DELETED]>
Subject: [seasar-dev:654] AOPをかけた後にAnnotationを読むには

> あるPOJOなクラスに
> 
> org.seasar.framework.aop.interceptors.TraceInterceptor
> 
> をかけてから、
> 
> beanDesc.getMethod("doJobA").getAnnotation(Next.class);
> 
> がnullを返すようになってしまったのですが、

S2AOP はアスペクトを適用するために動的にサブクラスを
作成し,メソッドをオーバーライドします.
そしてオーバーライドしたメソッドはアノテーションを
引き継ぎません.

そんなわけで (どんなわけで?),上記のコードだと
アスペクトが適用されたメソッドからアノテーションを
取得することはできません.

メソッドではなくクラスに付けられるアノテーションなら,
アノテーションに @Inherited を付ければいいのですが,
メソッドに付けたアノテーションでは無効なんですよね.

ともあれ (JW),コンポーネント・インスタンスから
getClass() すると,S2AOP がエンハンスしたクラスが
返ってきてしまうので,ComponentDef#getComponentClass()
するのがオススメです.



-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-dev メーリングリストの案内