グローバル関数が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()
しかし、上記はかなり役に立たないです。クラスパスで利用可能なすべてのクラスを検索し、末尾にKt
を追加して、すべてグローバルの関数に到達するとよいでしょう。しかし、jvmクラスローダーの性質上、これはthis answerで説明されているようにもう少し複雑です。
名前で関数を呼び出す代わりに関数参照を使用することを検討しましたか? –
私は動的に関数リファレンスを取得したいと思います。 –