在 Kotlin JVM 1.2.x 中,我曾经能够执行以下操作:
inline fun <R> Logger.logStuff(
crossinline f: () -> R
): R {
val methodName = object {}.javaClass.enclosingMethod.name
try {
this.debug("$methodName : Begin")
f()
this.debug("$methodName : End")
} catch (ex: Exception) {
this.error("$methodName : Threw exception : $ex")
throw ex
}
}
class Foo {
fun doStuff() = log.logStuff {
1 + 3
}
}
这会给我这样的日志:
Foo : doStuff : Begin
Foo : doStuff : End
但是,升级到 Kotlin 1.3.50(从 1.2.x 开始)后,我得到了如下日志:
Foo : logStuff : Begin
Foo : logStuff : End
我知道
currentThread().stackTrace[1].methodName
可以获取封闭的方法名称,但我希望避免这种情况。有没有另一种方法来获取当前的函数名称?
最佳答案
您可以将您的 logStuff() 乐趣转换为扩展并使您的 R 类型具体化,如下所示:
inline fun <reified R : Any> R.logStuff() {
val methodName = object {}.javaClass.enclosingMethod.name
}