java相当于__func__

时间:2011-03-26 00:11:08

标签: java reflection func

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

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

someFunc

什么是Java等价物?

我找到了

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

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

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

5 个答案:

答案 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();
}

这样,您不仅可以找到方法名称,还可以找到方法的其他有趣功能,例如注释,参数化类型等。

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