Ami*_*iri 14 reflection kotlin
如何在Kotlin中按名称动态获取函数?
即:
fun myFunc11() { println("Very useful function 11") }
val funcName = "myFunc" + 11
val funcRef = getFunction(funcName)
funcRef()
Run Code Online (Sandbox Code Playgroud)
编辑:接受的答案似乎是正确的,但是代码目前在Kotlin中遇到了一些错误.提交的错误报告:https://youtrack.jetbrains.com/issue/KT-10690
mie*_*sol 11
诸如fun myFunc11() { ... }在名为ie的文件中定义的全局函数Global.kt被编译为在文档中描述的static名称上的类的方法.GlobalKt
要按名称获取函数引用,您需要加载定义它的类.如果您知道定义函数引用的文件名,那么您可以尝试:
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
}
Run Code Online (Sandbox Code Playgroud)
然后你可以找到并调用Global.kt文件中定义的函数:
fun myFunc11() { println("Very useful function 11") }
Run Code Online (Sandbox Code Playgroud)
像这样:
val kFunction = getFunctionFromFile("Global", "myFunc11")
kFunction?.call()
Run Code Online (Sandbox Code Playgroud)
然而,上述内容相当无用.更好的解决方案是搜索类路径中可用的所有类,并以后缀为目标Kt来覆盖所有全局函数.然而,由于jvm类加载器的性质,如本答案所述,这涉及更多.
| 归档时间: |
|
| 查看次数: |
5038 次 |
| 最近记录: |