2

rangeQuery()Spring AOPを使用して、すべてのサブタイプでプロファイリングしようとしているメソッドを備えたインターフェースがあります。特に、への呼び出しについて、本体からフィールドでrangeQuery()別のメソッドを呼び出す回数を知りたいです。distance()

次のように、距離へのすべての呼び出しをカウントするメソッドを記述できることを知っています。

@Before("execution(* *.distance(..))") 
public void count(JoinPoint joinPoint) {
    count++
}

ただし、それはどのrangeQuery()呼び出しがそれを呼び出したかをキャプチャしません。

何か案は?

4

2 に答える 2

0

@Beforeを使用する代わりに、ソースの場所を取得するため@Aroundに使用できるを使用する必要があります。ProceedingJoinPoint

 @Around(" ..... ")
  public void test(ProceedingJoinPoint pjp) throws Throwable {

    SourceLocation sl = pjp.getSourceLocation();
    System.out.println(sl.getFileName());
    System.out.println(sl.getLine());
    System.out.println(sl.getWithinType());

    // allow through
    pjp.proceed();
  }

callあなたの場合、代わりに必要かもしれないように聞こえますが、Spring AOPではサポートされていないexecutionようcallです:-

その他のポイントカットタイプ

完全なAspectJポイントカット言語は、Springではサポートされていない追加のポイントカット指定子をサポートします。これらは、call、initialization、preinitialization、staticinitialization、get、set、handler、adviceexecution、withincode、cflow、cflowbelow、if、@ this、および@withincodeです。Spring AOPによって解釈されるポイントカット式でこれらのポイントカット指定子を使用すると、IllegalArgumentExceptionがスローされます。

于 2011-01-30T16:08:22.297 に答える
0

最後の手段として、@Before上記のアドバイスで、 を利用しThread.currentThread.getStackTrace()て、発信者が であるかどうかを確認できますrangeQuery

ただし、N 番目の位置をチェックして探しているメソッドであるかどうかを確認するだけでなく、スタック トレースで探すべきいくつかの固定された「パターン」を見つける必要があります。たとえば、特定の順序でその時点でスタック上にある必要があるとわかっている一連のメソッドは、他の中間スタック要素の発生を許可します。そうしないと、コードを変更すると、アドバイスが機能しなくなります。

于 2011-01-30T20:22:41.337 に答える