2011-03-26 97 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操作,所以你应该这样做小心。