5

私はしばらく AspectJ を使用してきましたが、注釈を含むオブジェクト スコープ フィールドでうまく機能します。ポイントカットで機能するメソッドスコープの変数に注釈を付けたいという状況に遭遇しましたが、問題が発生しています。

これが私が使用しているポイントカットです。変数がオブジェクトのフィールドである場合は正常に機能しますが、スコープをメソッド (メソッド内で宣言された変数) に縮小すると、機能しなくなり、理由がわかりません。私にできることを教えてください、ありがとう。

 after(final Trigger trigger): set(@Triggereable * *) && args(trigger)
 {
  System.out.println("trigger flush");
 }

また、ここに私がやりたいことの例があります。上記の System.out.println は、トリガーがインスタンス化されたときに起動する必要があります。

public void foo()
{
   @Triggereable
   private Trigger trigger = new Trigger();
}
4

2 に答える 2

5

そのような状況に陥った場合、実際の分野横断的な関心事を適用する代わりに、実装を変更しようとしている可能性があります。基本的に、AOP と AspectJ が使用されることになっているものではありません。

回避策として、関連する機能を別のメソッドに抽出してから、そのメソッドにアスペクトを適用するか、またはアラウンド アドバイスを使用してメソッド全体をそのローカル変数に置き換えることができます。

さらに、特定の例では、特定のメソッドのスコープ内でコンストラクターの実行にポイントカットを適用できるため、ローカル変数にバインドせずに実質的に同じことを行うことができます。

于 2010-12-20T16:35:42.757 に答える
1

AspectJ は現在、ローカル変数のポイントカットをサポートしていません ( FAQ エントリを参照してください)。

このような機能がまもなく追加される可能性があるという最近の議論を思い出すようですが、AspectJ の問題トラッカーにもメーリング リストのアーカイブにも見つかりませんでした。

于 2010-12-20T16:56:45.960 に答える