1

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

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

織り込もうとしているクラスで toString をオーバーライドした場合にのみ機能しますが、すべての toString メソッドで機能させる方法はありますか?

4

1 に答える 1

4

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

編集:見てみましたが、cflowも機能しません。ロード時のウィービングなしにこれを行う別の方法はわかりませんが、これにはtoString() へのすべての呼び出しをログに記録する必要があり、これは非常に悪い考えです。元のポイントカットが機能するように、すべてのメソッドでreturn super.toString()を使用して toString() を宣言する方がおそらくはるかに優れています(そして、 toString() が呼び出されない場合は何も失われません)。

このアプローチを追求することに決めた場合は、ロード時の織り込みを開始するためのaspectj ドキュメントのセクションがあります。

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


元の回答: cflowを使用して、toString() の制御フロー内の任意の結合ポイントに一致させることができます。これを確認できていないことに注意してください。構文を確認してください(確かに思い出すことはできませんが、call()ではなく実行()である必要があるかもしれません)。例えば:

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

もう 1 つの点として、System.out 呼び出しの追加に注意し、ロギング フレームワークの使用を検討してください。

于 2009-07-19T20:15:57.550 に答える