Java 获取调用方类和方法名

Java 获取调用方类和方法名,java,scala,reflection,logback,Java,Scala,Reflection,Logback,我试图在Scala应用程序的函数中获取调用方类和方法名。我目前正在使用堆栈跟踪,但性能有所下降。我在做类似的事情 stackTrace(CodeDepth).getClassName stackTrace(CodeDepth).getMethodName 我发现Java反射要快得多,但我只能用 sun.reflect.Reflection.getCallerClass(CodeDepth).getName() 有没有办法通过反射获得方法名(以及可选的行号)?也许用Scala的反射 谢谢不幸的

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

stackTrace(CodeDepth).getClassName
stackTrace(CodeDepth).getMethodName
我发现Java反射要快得多,但我只能用

sun.reflect.Reflection.getCallerClass(CodeDepth).getName()
有没有办法通过反射获得方法名(以及可选的行号)?也许用Scala的反射


谢谢

不幸的是,没有不昂贵的方法可以做到这一点。有一种方法可以添加一个更好的替代方案,但这并没有帮助,除非您可以等到Java9(而且它也不能保证被包括在内)


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

对于Scala,您可以使用源代码库,然后执行以下操作:

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

我想这就是你想要的:可能重复@nafas No,使用Throwable也很昂贵。请参阅以供参考。@RC链接中的答案似乎也很昂贵,因为它使用了一个资源流(IO)。上面的代码中的CodeDepth是什么?是的,它是一个热点。它是一个事件框架,位于我们应用程序的logback之上。我想在事件进入logback之前知道事件产生的方法和行号,这样我就可以以不同的格式将其传送到Kafka之类的工具。我知道logback有这个信息(至少是行号),而且速度非常快,所以理论上是可能的…logback使用堆栈跟踪,并在文档中特别警告“生成方法名不是特别快”。如果logback已经为您捕获了这个信息,您至少可以通过编写自己的编码器来避免两次获取堆栈跟踪,该编码器将侦听
ilogingevent
s Update:it…