5
#include <stdio.h>
void someFunc(void) {
  printf("%s\n"), __func__);
}

每次调用该函数时,它都会打印:

someFunc

什么是java等价物?

我已经找到

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

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

但是这些看起来很荒谬,有没有更简单的方法?

4

5 回答 5

6

不,没有更简单的方法。由于 Java 没有宏工具,因此没有任何东西直接等同于 C++ 版本。

于 2011-03-26T00:13:03.027 回答
2

通过一些配置,您可以使用包含方法名称(以及您想要的任何其他详细信息)的模式设置类似log4j的东西,然后您所要做的就是:

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

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

这样做的好处是您只需进行一次设置,然后您就可以在任意多个不同的地方重复使用记录器。

于 2011-03-26T00:23:07.787 回答
2

您可以使用 log4j 并在需要时使用 %M 模式输出方法名称 -> http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

但是,文档有以下警告:

警告生成调用方位置信息非常慢,除非执行速度不是问题,否则应避免。

他们可能使用类似于你的技巧(new Exception()).getStackTrace()[0].getMethodName(),但这是在每个日志语句中使用的非常慢的调用。

另一方面,log4j 是高度可定制的,您可以将方法名称输出添加到对性能不重要的代码子集。

于 2011-03-26T00:27:04.117 回答
2

答案是不。

顺便说一句,您发现的两种方法本质上是等效的。如果t是当前线程,则t.getStackTrace()通过创建实例Exception并调用getStaceTrace()它来工作。

正如其他人所指出的,Exception在 Java 中创建一个捕获堆栈跟踪的操作是一项昂贵的操作,因此您应该谨慎行事。

于 2011-03-26T00:31:40.540 回答
0

java.lang.reflect.Method接收封闭方法的另一种荒谬方式是:

void someMethod() {
    class A{}
    Method thisMethod = A.class.getEnclosingMethod();
}

这样,您不仅可以找到方法名称,还可以找到该方法的其他有趣特性,例如注解、参数化类型等。

我希望有一种更内置的方式在运行时获取元数据......

于 2019-04-09T17:03:52.867 回答