4

ライブラリをプロファイリングするために、aspectj を使用したいと思います。私の計画は、プロファイリングが必要なメソッドを注釈でマークすることでした:

@Profiled("logicalUnitOfWork")

logicalUnitOfWorkそして、 を使用してプロファイリングされたコンテンツを強調表示するメソッドの前後に起動するアスペクトを用意します。

したがって、最初のポイントカットは次のようになります。ここには注釈の引数がないことに注意してください。これは、どうすればよいかわからないことの 1 つです。

pointcut profiled() : execution(@Profiled * *());

before() : profiled () {
    // : the profiled logical name is in this variable:
String logicalEventType;
Profiler.startEvent (logicalEventType);
}

after() returning : profiled() {
    // : the profiled logical name is in this variable:
String logicalEventType;
    Profiler.endEvent (logicalEventType);
}

プロファイリングされるメソッドは、次のように定義されます。

@Profiled("someAction")
public void doAction (args...) {}

要するに、@Profiledアノテーションの値をアスペクトに取り込むにはどうすればよいですか? 値に基づいてどのプロファイリングが発生するかを制限する必要はありません。アドバイスに表示される必要があるだけです。また、これを機能させるには、アノテーションの保持をランタイムに設定する必要がありますか、または代わりにクラスレベルの保持を使用できますか?

4

2 に答える 2

2

これが最善の方法かどうかはわかりませんが、次のような方法を試すことができます。


   pointcut profiledOperation(Profiled p) : 
      execution(@Profiled * *()) && @annotation(p);

   before(Profiled p): profiledOperation(p)
   {
      System.out.println("Before " + p.value());
   }

   after(Profiled p): profiledOperation(p)
   {
      System.out.println("After " + p.value());
   }

実行時に注釈値にアクセスする必要があるため、をに設定する必要があり@RetentionますRUNTIME

于 2009-02-15T01:18:49.407 に答える
1

しばらく前に、「デフォルト値」でフィールドに注釈を付けるために同様のことを行いました。私はそれを注釈付きのメソッドに適応させようとしました。もちろん、簡潔にするために省略したので、ここにエラーチェックとnullテストを少し追加する必要があります。

ジョインポイントの静的部分を使用して、注釈の値を取得できます。

private String getOperationName(final JoinPoint joinPoint) {
   MethodSignature methodSig = (MethodSignature) joinPoint
      .getStaticPart()
      .getSignature();
   Method method = methodSig.getMethod();
   Profiled annotation = method.getAnnotation(Profiled.class);
   return annotation.value();
}

過度の反省を避けるために、around代わりにアドバイスを使用することをお勧めします。

around(): profiled() {
   String opName = getOperationName(thisJoinPoint);
   Profiler.startEvent(opName);
   proceed();
   Profiler.endEvent(opName);
}
于 2009-04-07T14:41:05.150 に答える