我有一个名为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);
}
}
我怎么能这样做?
答案 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