globalne funkcje, takie jak fun myFunc11() { ... }
zdefiniowane w pliku o nazwie tj Global.kt
są kompilowane do static
metod na klasy o nazwie GlobalKt
jak opisano w the documentation.
Aby uzyskać odniesienie do funkcji według nazwy, należy załadować klasę, która je definiuje. Jeśli znasz nazwę pliku, który definiuje nazwę funkcji, którą próbujesz znaleźć można zrobić:
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
}
Następnie można odnaleźć i nazwać funkcją określoną w Global.kt
pliku:
fun myFunc11() { println("Very useful function 11") }
tak:
val kFunction = getFunctionFromFile("Global", "myFunc11")
kFunction?.call()
Jednak powyższe jest całkiem bezużyteczne. Lepszym rozwiązaniem byłoby przeszukanie wszystkich klas dostępnych w ścieżce klas i przyrostek o numerze Kt
, aby uzyskać wszystkie funkcje globalne . Jednak ze względu na charakter ładowarek klasy jvm jest to nieco bardziej skomplikowane, jak opisano w this answer.
Czy rozważałeś użycie referencji funkcji zamiast wywoływać funkcje po nazwie? –
Chciałbym dynamicznie uzyskać odniesienie do funkcji. –