更新
如何使用
Kotlin
获取当前正在执行的函数名称?
我试图获取当前正在执行的函数的函数名称,如下所示,但它总是为空
val funName = Object().`class`.enclosingMethod?.name;
我找到了一种方法:-
val name = object : Any() {
}.javaClass.enclosingMethod.name
上面的代码也可以细化为-
val name = object{}.javaClass.enclosingMethod.name
编辑,因为不正确的重复标记会阻止新答案:
更Java的方式是这样的:
Thread.currentThread().stackTrace[1].methodName
但在我的系统上大约需要 47 毫秒,而基于 object() 的系统大约需要 13 毫秒:慢了近 4 倍。
如果您不需要在运行时动态发现名称,还有另一种选择:
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);
}
接受的答案适用于 Kotlin 1.9。
object {}.javaClass.enclosingMethod.name
如果您发现日志代码太长,可以使用以下扩展。
val Any.methodName: String get() = javaClass.enclosingMethod.name
然后你可以通过
object {}.methodName
获取方法名称。