注释打开性能跟踪的方法

时间:2016-02-27 08:01:14

标签: java

我有一个名为public void httpcall()的方法的Test类,我需要获取此方法的执行时间。为了做到这一点,我在调用之前和之后使用了System.nanoTime()。我从那段时间内得到了执行时间。

代码段:

public class Test{

    public void httpcall(){
        try {

            HttpResponse rs = HttpClientUtil.get("http://192.169.1.2:9090/plugins/restapi/v1/users/9223370580466120397/roster",RestOpenfire.ACCEPT, "8V9BUNA0f1gNQI3S");


        } catch (Exception e) {

            System.out.println("Error : "+e);

        }
    }

    public static void main(String[] args) {

        Test test=new Test();
        long startTime = System.nanoTime();

            test.httpcall();

        long endTime = System.nanoTime();

        long duration = (endTime-startTime);

        System.out.println("Execution Time : "+duration);

    }

}

我想制作一个像@Time这样的注释,它给出了方法的执行时间,比如..

@Time
public void httpcall(){
    try {
        HttpResponse rs = HttpClientUtil.get("http://192.169.1.2:9090/plugins/restapi/v1/users/9223370580466120397/roster", 
                RestOpenfire.ACCEPT, "8V9BUNA0f1gNQI3S");
    } catch (Exception e) {
        System.out.println("Error : " + e);
    }
}

我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

您可以尝试使用aspectj,它可以将源代码更改为构建的一部分,在称为编织的过程中更改.class文件或在运行时更改它。

https://mathewjhall.wordpress.com/2011/03/31/tracing-java-method-execution-with-aspectj/

思想,这可能是一种矫枉过正。 除非你有一个难以重构的庞大系统,否则我建议使用模板方法。也就是说,

abstract class Measurable
{
   protected void abstract doWork();

   public void execute(){
     stopWatch = StopWatch.start();
     doWork();
     stopWatch.stop();
     System.out.println(stopWatch.getTime());
   }
}

class MyHttpClient extends Measurable
{
    doWork(){
        HttpResponse rs = HttpClientUtil.get("http://192.169.1.2:9090/plugins/restapi/v1/users/9223370580466120397/roster",RestOpenfire.ACCEPT, "8V9BUNA0f1gNQI3S");
    }
}

public static void main(String[] args) {

    MyHttpClient test=new MyHttpClient();
    test.execute();
}

MyHttpClient的所有用法都会调用 execute()方法。

另请注意,我使用了StopWatch类,因为它比使用System.currentTimeMillis更优雅和标准。 https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/StopWatch.html