有没有办法通过反射获取 Kotlin 函数的所有者

Is there a way to get Kotlin function's owner via reflection

假设我们有以下函数:

class MyClass {
fun myFunction() {}
companion object {
    fun myStaticFunction() {}
}
}

fun myTopLevelFunction() {}

当我通过以下调试时:

           val functions = listOf(
            MyClass::myFunction,
            MyClass.Companion::myStaticFunction,
            ::myTopLevelFunction
        )
        functions.forEach {
            val names = (it::class.java).fields.map {
                method -> println(method.name)
            }

Intellij 可以在“Evaluate Expression”中正确地向我显示此信息

但是我找不到通过反射来做到这一点的方法。例如,我不知道如何读取函数的所有者。我错过了什么? TIA.

在 Intellij 中,我可以这样查看函数的所有者

myFunction -> MyClass
myStaticFunction -> MyClass.Companion
myTopLevelFunction -> MyFileNameKt

我相信KFunction没有为我们提供这样的能力。如果您不害怕使用 kotlin.jvm.internal 包中公开可用的实用程序,那么您可以检查 KFunction 是否是 CallableReference 然后使用它的 owner 属性:

functions.forEach {
    if (it is CallableReference) {
        println(it.owner)
    }
}