Le funzioni globali come fun myFunc11() { ... }
definiti nel file denominato cioè Global.kt
vengono compilati a static
metodi su una classe denominata GlobalKt
come descritto in the documentation.
Per ottenere una funzione di riferimento per nome è necessario caricare la classe che la definisce. Se si conosce il nome del file che definisce il riferimento alla funzione che si sta cercando di trovare che si può fare:
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
}
Quindi è possibile trovare e chiamare la funzione definita nel file di Global.kt
:
fun myFunc11() { println("Very useful function 11") }
in questo modo:
val kFunction = getFunctionFromFile("Global", "myFunc11")
kFunction?.call()
Tuttavia quanto sopra è piuttosto inutile. Una soluzione migliore sarebbe quella di cercare tra tutte le classi disponibili in classpath e con suffisso Kt
per raggiungere tutte le funzioni globali. Tuttavia, a causa della natura dei caricatori di classe jvm, questo è un po 'più complicato come descritto in this answer.
Hai considerato di utilizzare i riferimenti alle funzioni invece di chiamare le funzioni per nome? –
Mi piacerebbe acquisire il riferimento alla funzione in modo dinamico. –