【问题标题】:Get name of current function in Kotlin获取 Kotlin 中当前函数的名称
【发布时间】:2018-01-10 06:49:19
【问题描述】:

更新

如何使用Kotlin 获取当前正在执行的函数名称?

我正在尝试获取当前正在执行的函数的函数名称,如下所示,但它始终为 null

val funName = Object().`class`.enclosingMethod?.name;

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    我找到了一种方法:-

    val name = object : Any() {
    
    }.javaClass.enclosingMethod.name
    

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

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

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

    一个更Java的方式是这样的:

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

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

    【讨论】:

    • 为了安全起见:object{}.javaClass.enclosingMethod?.name
    • object{}.javaClass.enclosingMethod 在 Kotlin 1.2.x 中有效,但在 Kotlin 1.3.50 中似乎不再有效
    • stackTrace 方法不适用于被覆盖的方法。尝试在 Activity 的 onCreate 中运行该代码,它将返回一个名为“getStackTrace”的方法。在 onCreate 中运行 enclosingMethod 也会返回 null。
    • 你也能得到函数的参数值吗?
    • 如果您有 Log 方法并且想要父方法的名称,请使用“Thread.currentThread().stackTrace[3].methodName”。
    【解决方案2】:

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

    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 :)
    猜你喜欢
    • 2014-01-15
    • 2011-04-17
    • 2011-06-11
    • 1970-01-01
    • 2020-01-11
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多