在 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
}

10-08 08:00