2011-11-22 11 views
0

私は、特定のタイプ(項目)内のすべてのセッターをマッチングさせるための「作業」AspectJのウィーバーのパターンがあります。それはちょうど、すべての潜在的なセッターのための膨潤が、それに動作しAspectJのウィーバーセッターパターン問題

public pointcut setter(Item item) : 
    target(item) 
    && execution(void Item+.set*(*)); 

を1つの引数を取る "setup"のような名前のメソッドにマッチします。

私の解決策は、今度は、4番目の文字が小文字かどうか(thisJoinPoint.getSignature()。getName())に基づいて、すべてのセッターをインターセプトするメソッドをチェックすることです。 。

"set"の後に小文字のすべてのメソッドを除外するより良い方法はありますか?私が知る限り、正規表現はAspectJパターンの一部ではありません。

答えて

1

これはあまり醜いであれば、私は知りませんが、あなたは注釈@NoSetterを導入し、側面が適用されたくないsetup(...)のような別のpointcut noSetterに除外する方法でこれを使用することができます。

public pointcut noSetter(Item item) : 
target(item) 
&& execution(void @NoSetter Item+.*(..)); 

次のようにポイントカットsetterを変更します。

public pointcut setter(Item item) : 
target(item) 
&& execution(void Item+.set*(*)) 
&& !noSetter(); 

私はsetterメソッドは、特定のイベントを発生するために必要な状況で、このアプローチを使用しました。私たちはコードを生成することができず、手作業で行うのは面倒でエラーが起こりやすいものでした。また、一部のセッターでは、イベントは明示的には起動されませんでした。

[上の構文はテストされていません。これを確認するためのIDEはありません]

+0

ありがとうございました。私はこれがきれいな解決策に近づけることができると思います。これは開発プロセスの後半に引き継がれる非常に大規模なエンタープライズプロジェクトなので、これは最高のものではありません。それにもかかわらず、それは動作します。 – Stmated

1

はい、この問題の原因は他にもあります。 あなただけの設定方法を避けるためにしようとしている場合は、あなたが追加することができます& &!実行(無効項目+ .setup(*))

ます。また、+ & &!実行(無効項目を追加することの醜いソリューションを使用することができます。瀬田*())& &!実行(無効項目+ .setb(*))& &!実行(無効項目+ .setc *(*))のように...

それとも、何かを知っていればあなたが避けたいメソッドについては、this()またはcflow()のポイントカットを追加する組み合わせかもしれません。