Get function by name dynamically in Kotlin

后端 未结 1 1635
渐次进展
渐次进展 2021-01-17 11:30

How can I dynamically get a function by name in Kotlin ?

i.e:

fun myFunc11() { println(\"Very useful function 11\") }

val funcName = \"myFunc\" + 11         


        
相关标签:
1条回答
  • 2021-01-17 11:35

    The global functions such as fun myFunc11() { ... } defined in file named i.e. Global.kt are compiled to static methods on a class named GlobalKt as described in the documentation.

    To get a function reference by name you'll need to load the class that defines it. If you know the file name that defines the function reference you're trying to find you can do:

    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
    }
    

    Then you can find and call function defined in Global.kt file:

    fun myFunc11() { println("Very useful function 11") }
    

    like so:

    val kFunction = getFunctionFromFile("Global", "myFunc11")
    kFunction?.call()
    

    However the above is pretty useless. A better solution would be to search through all classes available in classpath and suffixed with Kt to reach all global functions. However due to nature of jvm class loaders this is a bit more involved as described in this answer.

    0 讨论(0)
提交回复
热议问题