2009-07-19 12 views
1

public pointcut myToString() : within(mypackage.*) 
&& execution(public String toString()); 

String around(): myToString(){ 
    System.out.println("myToString"); 
    return proceed(); 
} 

これは、私が織りようとしているクラスImのtoStringをオーバーライドした場合にのみ機能します。すべてのtoStringメソッドで機能させる方法はありますか?AspectJとtoString()

+0

多分、Object.toString() –

+0

を織り込もうとするべきでしょう。それはオーバーライドされていないすべてのtoString()にマッチするでしょう –

答えて

4

within()はパッケージ内での実行にのみ一致しますが、明示的に宣言されていない限り、toString()メソッドを継承しているため動作しません。

編集:私は見た、cflowも動作しません。私はロード時間の織りを使わないでこれを行う別の方法はありませんが、これはロギングを伴うでしょうすべては非常に良いアイデアですtoString()を呼び出します。 すべてのメソッドのtoString()をで返すだけで、元のポイントカットが機能するようにsuper.toString()を返すほうがはるかに良いでしょう。そうでなければ何も失われません。

このアプローチを実行することを決定した場合は、aspectj documentationのセクションがあります。このセクションでは、読み込み時間の織りを開始することができます。

更新:もう1つのオプションは、EclipseのDetail Formattersを使用することです。それらを使用すると、デバッグの目的でtoString()メソッドをデコレートできます。


オリジナルの答え: あなたは)いずれかのtoString(の制御フローでポイントに参加一致する CFLOW を使用して試みることができます。私はこれを確認できませんでしたので、構文をチェックしてください(私は確かに思い出すことができませんが、call()ではなくexecute()する必要があるかもしれません)。たとえば :

public pointcut myToString() : cflow(call(String mypackage.*.toString())); 

もう一つのポイント、のSystem.outコールを追加するには注意してください、ロギングフレームワークを使用することを検討してください。

+0

thx、私を助けようとしています、コンパイル時の織り方を使用する方法?それは悪い考えかもしれないが、私はテストのためにこれを使用するので、あまりにも悪くないはずです。 – martin

+0

残念ですが** load ** - 時間織り、更新され、参照が追加されているはずです。 –