获取调用者 class 和方法名称

Get caller class and method name

我试图在 Scala 应用程序的函数中获取调用者 class 和方法名称。我目前正在使用堆栈跟踪,但性能有所下降。我正在做类似

的事情
stackTrace(CodeDepth).getClassName
stackTrace(CodeDepth).getMethodName

我发现 Java 反射要快得多,但我只能通过

获得 class 名称
sun.reflect.Reflection.getCallerClass(CodeDepth).getName()

有没有办法通过反射获取方法名(以及可选的行号)?也许使用 Scala 的反射?

谢谢

不幸的是,没有昂贵的方法来做到这一点。有一个 Java Enhancement Proposal 可以添加一个更好的选择,但这没有帮助,除非你可以等到 Java 9(并且不能保证无论如何都会包含它)。

另一方面,这真的是您代码中的热点吗?只有在循环中调用它才有意义,在这种情况下,您可能可以调用它一次并缓存结果。

对于 Scala,您可以使用 https://github.com/lihaoyi/sourcecode 中的源代码库并执行类似以下操作:

def log(foo: String)(implicit line: sourcecode.Line, file: sourcecode.File) = {
  println(s"${file.value}:${line.value} $foo")
}

log("Foooooo") // sourcecode/shared/src/test/scala/sourcecode/Tests.scala:86 Fooooo