有没有办法通过反射获取 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”中正确地向我显示此信息
- 所有者(MyClass,MyClass.Companion等
- 这是否是顶级函数
但是我找不到通过反射来做到这一点的方法。例如,我不知道如何读取函数的所有者。我错过了什么? 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)
}
}
假设我们有以下函数:
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”中正确地向我显示此信息
- 所有者(MyClass,MyClass.Companion等
- 这是否是顶级函数
但是我找不到通过反射来做到这一点的方法。例如,我不知道如何读取函数的所有者。我错过了什么? 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)
}
}