2010-12-14 2 views
2

Javaにアノテーションを付けて特定の関数をトレースする方法はありますか? FOO返す**アノテーションを使用したトレースの実行

**がfoo(5)

を入力:10

トレースが有効になっている場合は、私が得る、そして、

class Foo { 

    @trace 
    int foo(int bar) { 
     return bar + 5; 
    } 
} 

:私はこれを行うことができるようにしたいです

答えて

1

あなたは@Around注釈

どのように私にして、この使用したスプリングAOPを行うことができますmplementのAOPロギング:

com.companyに以下のクラスを作成applicationContext.xmlを

<aop:aspectj-autoproxy/> 
    <context:annotation-config/> 
    <context:component-scan base-package="com.company.*"/> 

にこれを追加*パッケージ:。

package com.company.*; 

import org.apache.log4j.Logger; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.springframework.stereotype.Component; 
import org.springframework.util.StopWatch; 

@Component 
@Aspect 
public class AOPMethodLogger { 

    @Around("bean(*Service)") 
    public Object timeMethod(ProceedingJoinPoint joinPoint) throws Throwable { 
     StopWatch stopWatch = new StopWatch(); 
     stopWatch.start(); 
     Object retVal = joinPoint.proceed(); 
     stopWatch.stop(); 
     if(stopWatch.getTotalTimeMillis() > 35){ 
      StringBuffer logMessageStringBuffer = new StringBuffer(); 
      logMessageStringBuffer.append(joinPoint.getTarget().getClass().getName()); 
      logMessageStringBuffer.append("."); 
      logMessageStringBuffer.append(joinPoint.getSignature().getName()); 
      logMessageStringBuffer.append("("); 
      logMessageStringBuffer.append(joinPoint.getArgs()); 
      logMessageStringBuffer.append(")"); 
      logMessageStringBuffer.append(" execution time: "); 
      logMessageStringBuffer.append(stopWatch.getTotalTimeMillis()); 
      logMessageStringBuffer.append(" ms"); 
      System.out.println(logMessageStringBuffer.toString()); 
     } 
     return retVal; 
    } 

} 
1

次の方法で注釈を追加することなく、これを行うことができますInTraceというツールを使用します。

注:InTraceは、私が書いた無料のオープンソースツールです。

関連する問題