在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类装载器的性质,这个更复杂一些,就像这个答案中所描述的那样。