获取 Kotlin 中当前函数的名称

问题描述 投票:0回答:3

更新

如何使用

Kotlin
获取当前正在执行的函数名称?

我试图获取当前正在执行的函数的函数名称,如下所示,但它总是为空

val funName = Object().`class`.enclosingMethod?.name;
android kotlin
3个回答
57
投票

我找到了一种方法:-

val name = object : Any() {

}.javaClass.enclosingMethod.name

上面的代码也可以细化为-

val name = object{}.javaClass.enclosingMethod.name

编辑,因为不正确的重复标记会阻止新答案:

更Java的方式是这样的:

Thread.currentThread().stackTrace[1].methodName

但在我的系统上大约需要 47 毫秒,而基于 object() 的系统大约需要 13 毫秒:慢了近 4 倍。


26
投票

如果您不需要在运行时动态发现名称,还有另一种选择:

instance::method.name

查看以下示例https://pl.kotl.in/1ZcxQP4b3

fun main() {
    val test = Test()
    test.methodA()
    println("The name of method is ${test::methodA.name}")
}

class Test {
    fun methodA() {
        println("Executing method ${this::methodA.name}")
        println("Executing method ${::methodA.name} - without explicit this")
    }
}

执行

main()
后你会看到:

Executing method methodA
Executing method methodA - without explicit this
The name of method is methodA

通过这种方式,您可以利用所有“IDE 智能”(重命名、搜索出现的情况等),但重要的是,所有出现的

instance::method.name
在编译过程中都会被 Kotlin 替换为普通字符串。如果你反编译 Kotlin 生成的字节码,你会看到:

public final void main() {
    Test test = new Test();
    test.methodA();
    String var2 = "The name of method is " + "methodA"; // <--- ordinary string, no reflection etc.
    boolean var3 = false;
    System.out.println(var2);
}

0
投票

接受的答案适用于 Kotlin 1.9。

object {}.javaClass.enclosingMethod.name

如果您发现日志代码太长,可以使用以下扩展。

val Any.methodName: String get() = javaClass.enclosingMethod.name

然后你可以通过

object {}.methodName
获取方法名称。

© www.soinside.com 2019 - 2024. All rights reserved.