如何在 Kotlin 中通过名称动态获取函数?
即:
fun myFunc11() { println("Very useful function 11") }
val funcName = "myFunc" + 11
val funcRef = getFunction(funcName)
funcRef()
编辑: 接受的答案似乎是正确的,但是代码目前在 Kotlin 中遇到了一些错误。提交的错误报告:https://youtrack.jetbrains.com/issue/KT-10690
最佳答案
在名为Global.kt
的文件中定义的fun myFunc11() { ... }
等全局函数被编译为static
the documentation 中描述的名为 GlobalKt
的类的方法.
要按名称获取函数引用,您需要加载定义它的类。如果您知道定义要查找的函数引用的文件名,您可以这样做:
fun getFunctionFromFile(fileName: String, funcName: String): KFunction<*>? {
val selfRef = ::getFunctionFromFile
val currentClass = selfRef.javaMethod!!.declaringClass
val classDefiningFunctions = currentClass.classLoader.loadClass("${fileName}Kt")
val javaMethod = classDefiningFunctions.methods.find { it.name == funcName && Modifier.isStatic(it.modifiers)}
return javaMethod?.kotlinFunction
}
然后就可以找到并调用Global.kt
文件中定义的函数了:
fun myFunc11() { println("Very useful function 11") }
像这样:
val kFunction = getFunctionFromFile("Global", "myFunc11")
kFunction?.call()
但是上面的内容很没用。更好的解决方案是搜索类路径中所有可用并以 Kt
为后缀的类以访问所有 global 函数。然而,由于 jvm 类加载器的性质,这涉及到更多,如 this answer 中所述。 .
关于reflection - 在 Kotlin 中按名称动态获取函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34824324/