Java:函数可以返回调用类和方法名称的任何简单方法吗?

时间:2009-07-19 22:33:10

标签: java reflection

我经常会从Java中向我的日志文件发送调试信息,它有助于提供关于代码中生成日志消息的位置的正确信息,以便我可以快速参考它。我不想在日志消息中对其位置进行硬编码,因为如果我重命名其方法或者将代码重构为不同的结构,我必须记住更新日志消息。我希望有一个静态函数,只返回调用函数的类和方法名称。例如,如果我有一个名为Machine的类和一个名为doS​​tuff的方法,我希望该方法中的日志消息生成代码看起来像这样:

String log_msg = Blah.getClassAndMethodName()+" did the wrong thing!";

类Blah中的静态方法getClassAndMethodName()将返回“Machine.doStuff”。这样,当我查看日志文件时,我可以轻松地告诉代码在哪里生成消息。我意识到这有点棘手,因为我需要Blah中的这个方法在一个单独的类Machine中返回有关其调用函数的信息,但是这样可以很容易地在任何地方使用这个静态调用。

我不知道这是否可行,但我很感激任何答案!另外,假设有可能,这是一种特别高的开销类型的操作吗? (我假设需要反思,而不是我的强项)

谢谢!

3 个答案:

答案 0 :(得分:8)

如果您拨打Thread.getStackTrace(),则可以从那里确定您的电话筹码。

  

返回堆栈跟踪数组   表示堆栈转储的元素   这个帖子。这种方法会   如果这样,则返回零长度数组   线程尚未启动或有   终止。如果返回的数组是   非零长度然后第一个   数组的元素代表   堆栈的顶部,这是最多的   最近的方法调用   序列。最后一个元素   数组代表底部   堆栈,这是最近的   序列中的方法调用。

重新。性能。我不能建议你测量它。如果您的调试输出可以启用/禁用,我会确保您只在启用启用调试输出时执行上述操作,因此您只需在需要时获取性能。

答案 1 :(得分:2)

试试这个:

    public static Log make() {
    Throwable t = new Throwable();
    StackTraceElement directCaller = t.getStackTrace()[1];
    return LogFactory.getLog(directCaller.getClassName());
}

stacktrace中的第一个条目是调用类

答案 2 :(得分:1)

考虑使用日志框架来执行此操作。

我相信标准的Java 1.4 java.util.logging。*允许你想要的东西。