2017-05-29 72 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

相關問題