【发布时间】:2018-01-10 06:49:19
【问题描述】:
更新
如何使用Kotlin 获取当前正在执行的函数名称?
我正在尝试获取当前正在执行的函数的函数名称,如下所示,但它始终为 null
val funName = Object().`class`.enclosingMethod?.name;
【问题讨论】:
更新
如何使用Kotlin 获取当前正在执行的函数名称?
我正在尝试获取当前正在执行的函数的函数名称,如下所示,但它始终为 null
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);
}
【讨论】:
::yourMethod.name :)