我的一位同事决定我们需要在执行时打印每个类和方法,以便在每个方法的开头迅速输入每个方法和类的名称。这对我来说并不是一点点痛苦,所以我抬头看了网,想出了:
System.out.println(new Object(){}.getClass().getEnclosingClass().getSimpleName()+ " : "+
new Object(){}.getClass().getEnclosingMethod().getName() +" [IN]");
这很有效。除了现在我已经被告知这是不能令人满意的,因为我们创建对象的唯一目的是找到名称,我们应该"相反,只需使用课程' .class property"。小问题,我似乎无法让它发挥作用。
我在网上找到的其他内容是:
System.out.println(Thread.currentThread().getStackTrace()[1].getClassName() + " : "+
Thread.currentThread().getStackTrace()[1].getMethodName() +" [IN]");
我做了我需要的但有人建议它是S-L-O-W,不得不进行堆栈跟踪。
有人有什么好建议吗?
答案 0 :(得分:0)
我注意到没有人回答这个问题,所以我写了一些东西,用硬编码版本作为控件对这两个版本进行计时。这些函数在2998 MHz上被称为百万次,SPARC-T4在64位,Java 1.8.0_91上被称为。
public String findFunc1()
{
Class myCls=new Object(){}.getClass();
String ret=myCls.getEnclosingClass().getSimpleName()+ " : "
+myCls.getEnclosingMethod().getName()+ " [IN]";
return ret;
}
public String findFunc2()
{
StackTraceElement mySTE=Thread.currentThread().getStackTrace()[1];
String ret=mySTE.getClassName() + " : "+ mySTE.getMethodName() + " [IN]";
return ret;
}
public String findFunc3()
{
String ret="TimeLog"+ " : "+ "findFunc3" + " [IN]";
return ret;
}
他们被称为如下:
public static void time1() {
System.out.print("new Object version ");
long startTime = System.currentTimeMillis();
String ret;
TimeLog prog=new TimeLog();
for(int ii=0; ii<1*1000*1000; ii++) {
ret=prog.findFunc1();
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("Elapsed msec="+totalTime);
}
这给出了:
new Object version Elapsed msec=13923
StackTrace version Elapsed msec=13459
Constant version Elapsed msec=13
两个版本消耗相似的时间,但硬编码版本的速度要快1000倍。