在Java中查找调用方法和类

时间:2017-05-29 20:29:22

标签: java debugging

我的一位同事决定我们需要在执行时打印每个类和方法,以便在每个方法的开头迅速输入每个方法和类的名称。这对我来说并不是一点点痛苦,所以我抬头看了网,想出了:

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,不得不进行堆栈跟踪。

有人有什么好建议吗?

1 个答案:

答案 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倍。