在Kotlin中动态获取函数名称
如何在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() { ... }
等全局函数被编译为名为GlobalKt
的类的static
方法,如文档中所述 。
要通过名称获得函数引用,您需要加载定义它的类。 如果您知道定义函数引用的文件名称,那么您可以执行以下操作:
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()
但是,上述是相当无用的。 更好的解决方案是搜索classpath中所有可用的类,并用Kt
后缀来实现所有的全局功能。 然而,由于jvm类装载器的性质,这个更复杂一些,就像这个答案中所描述的那样。