2017-05-29 107 views
0

我的一位同事决定,我们需要在执行它们时打印每个类和方法,以便他在每个方法的开始时及时键入每个方法和类的名称。这是不是有点痛苦给我,让我抬起头,在网络上,并与上前:在Java中查找调用方法和类的名称

System.out.println(new Object(){}.getClass().getEnclosingClass().getSimpleName()+ " : "+ 
    new Object(){}.getClass().getEnclosingMethod().getName() +" [IN]"); 

这个工程膨胀。除此之外,我已被告知,这是不令人满意的,因为我们创建对象只是为了查找名称,我们应该“而不是简单地使用类'.class属性”。小问题,我似乎无法得到那个工作。

别的东西,我在网上找到了:

System.out.println(Thread.currentThread().getStackTrace()[1].getClassName() + " : "+ 
    Thread.currentThread().getStackTrace()[1].getMethodName() +" [IN]"); 

它做什么,我需要但有人认为它是S-L-O-W,不必做一个堆栈跟踪。

有没有人有什么好的建议?

+0

您是否试图从头开始重新创建日志框架? –

+0

气垫船是正确的 - 使用日志框架,而不是重新发明它。获取方法名称总是很慢,无论你如何做。 –

+0

不要重新发明车轮。使用日志框架,即[Logback](https://logback.qos.ch/)。 –

回答

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

+0

可爱。我不知道这会慢很多。我想象一个日志框架必须通过类似的过程来找出调用者的名字。我不能相信Java没有类似于__FILE__和__func__的东西。是的,在C中,这些是在预处理器中实现的,但这并不意味着它们不能通过其他方式提供给编译器。我想这就是它的方式。 – user1683793