#include <stdio.h>
void someFunc(void) {
printf("%s\n"), __func__);
}
每次调用该函数时,都会打印:
someFunc
什么是Java等价物?
我找到了
(new Exception()).getStackTrace()[0].getMethodName()
和
java.lang.Thread.currentThread().getStackTrace()[1].getMethodName()
但这些看起来很荒谬,有更简单的方法吗?
答案 0 :(得分:6)
不,没有更简单的方法。由于Java没有宏设施,因此没有什么能直接等同于C ++版本。
答案 1 :(得分:2)
通过一些配置,您可以使用包含方法名称(以及您想要的任何其他详细信息)的模式设置log4j之类的内容,然后您需要做的就是:
private static final Logger log = Logger.getLogger(MyClass.class);
void someMethod() {
log.info("text");
}
这样做的好处是您可以进行一次设置,然后您可以根据需要在多个不同的位置重复使用记录器。
答案 2 :(得分:2)
您可以使用log4j并使用%M模式在需要时输出方法名称 - &gt; http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
但是,该文档有此警告:
警告生成来电者位置 信息极其缓慢 除非执行,否则应该避免 速度不是问题。
他们可能使用类似于(new Exception()).getStackTrace()[0].getMethodName()
的技巧,但这是在每个日志语句中使用的非常慢的调用。
另一方面,log4j是高度可自定义的,您可以将方法名称输出添加到代码的非性能关键子集中。
答案 3 :(得分:2)
答案是否。
顺便提一下,您发现的两种方法基本相同。如果t
是当前主题,那么t.getStackTrace()
的工作原理是创建Exception
的实例并在其上调用getStaceTrace()
。
正如其他人所说,创建一个Exception
来捕获堆栈跟踪是一项昂贵的Java操作,所以你应该谨慎行事。
答案 4 :(得分:0)
接收封闭方法java.lang.reflect.Method
的另一种荒谬方式是:
void someMethod() {
class A{}
Method thisMethod = A.class.getEnclosingMethod();
}
这样,您不仅可以找到方法名称,还可以找到方法的其他有趣功能,例如注释,参数化类型等。
我希望有一种更内置的在运行时获取元数据的方式...