2011-03-26 101 views
4
#include <stdio.h> 
void someFunc(void) { 
    printf("%s\n"), __func__); 
} 

每次調用函數時它會打印:的Java相當於__func__

someFunc 

什麼是Java相當於?

我發現

(new Exception()).getStackTrace()[0].getMethodName() 

而且

java.lang.Thread.currentThread().getStackTrace()[1].getMethodName() 

但這些只是似乎很可笑,有更簡單的方法嗎?

+0

不要指望Java與所有C++結構直接相等,反之亦然。 – 2011-03-26 00:21:23

回答

6

不,沒有簡單的方法。由於Java沒有宏設施,所以沒有什麼東西直接等同於C++版本。

+3

從技術上講,'__func__'不是預處理器宏 - C或C++預處理器沒有函數的概念。它由編譯器自己實現。 – thkala 2011-03-26 00:21:29

2

只要一點配置的,你可以建立類似log4j與包括方法名(以及任何你想要的其他詳細信息)的模式,那麼所有你需要做的是一樣的東西:

private static final Logger log = Logger.getLogger(MyClass.class); 

void someMethod() { 
    log.info("text"); 
} 

這樣做的好處是您只需進行一次設置,然後就可以在任意位置重複使用記錄器。

2

你可以使用log4j的,並使用%M行話輸出方法名,在需要的時候 - >http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

的文件,不過,有這樣的警告:

警告生成呼叫者位置 信息極其緩慢,應該避免使用 ,除非執行 速度不是問題。

他們可能使用類似於你的(new Exception()).getStackTrace()[0].getMethodName()的技巧,但這是一個非常緩慢的調用,用在每個日誌語句中。

另一方面,log4j具有高度的可定製性,您可以將方法名稱輸出添加到您的代碼的非性能要求的子集中。

2

答案是No.

順便提一下,你發現的兩種方法基本上是等價的。如果t是當前線程,則t.getStackTrace()通過創建Exception的實例並對其調用getStaceTrace()來工作。

正如其他人已經指出,創建一個Exception來捕獲堆棧跟蹤是一個昂貴的Java操作,所以你應該這樣做小心。