私はGenericServletから派生し、その派生クラスに@Txを付けてアノテートしています。サーブレットの起動時にGenericServlet.init()メソッド呼び出しを使用して、サーブレットの外でaop経由でいくつかの初期化をトリガーしたいとします。最初の2行はまったく一致せず、3番目の行は明らかにすべてのサーブレットに一致し、4番目の行は注釈を使用してターゲットを指定してもすべてのサーブレットに一致します。AspectJ:注釈付きサブクラスインスタンスのGenericServlet.init()呼び出し
@Before("@this(com.github.jjYBdx4IL.aop.tx.Tx)
&& execution(* javax.servlet.GenericServlet+.init()) && this(foo)")
@Before("@target(com.github.jjYBdx4IL.aop.tx.Tx)
&& execution(* javax.servlet.GenericServlet+.init()) && this(foo)")
@Before("execution(* javax.servlet.GenericServlet+.init()) && this(foo)")
@Before("target(@com.github.jjYBdx4IL.aop.tx.Tx Object)
&& execution(* javax.servlet.GenericServlet+.init()) && this(foo)")
この最初の行は、私はGenericServlet.init(..)でGenericServletから+の.init()を置き換える場合は奇妙である
@Before("@this(com.github.jjYBdx4IL.aop.tx.Tx)
&& execution(* javax.servlet.GenericServlet.init(..)) && this(foo)")
は、デバッガを使用して、GenericServlet.init()は間違いなくなりますので、動作しますGenericServlet.init(ServletConfig)から呼び出されます...
ここでは何が起こっているのですか?私は最初の行がトリックをするべきだと思うが、それはしない。
私は、Jettyインスタンス自体とwebappのクラスローダーで使用されているクラスローダーの分離に関係していると思っています。私は少なくとも次のようにinit()メソッドを作りました。 maspectjのデバッグ出力):
@After("@this(com.github.jjYBdx4IL.aop.tx.Tx
&& target(javax.servlet.GenericServlet+)
&& execution(* init()) && this(foo)")
トリガーしません。
更新
私はこれまで問題をトレースする:URLClassLoader loads Annotation as com.sun.$Proxy$27
を基本的には、foo.getClass()isAnnotationPresent(Tx.class)は常にfalseを返します。今問題は、このナンセンスは何ですか?どうすれば無効にできますか?