reflection - 在 Kotlin 中按名称动态获取函数

标签 reflection kotlin

如何在 Kotlin 中通过名称动态获取函数?

即:

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

val funcName = "myFunc" + 11
val funcRef = getFunction(funcName)

funcRef()

编辑: 接受的答案似乎是正确的,但是代码目前在 Kotlin 中遇到了一些错误。提交的错误报告:https://youtrack.jetbrains.com/issue/KT-10690

最佳答案

在名为Global.kt的文件中定义的fun myFunc11() { ... }等全局函数被编译为static the documentation 中描述的名为 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
}

然后就可以找到并调用Global.kt文件中定义的函数了:

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

像这样:

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

但是上面的内容很没用。更好的解决方案是搜索类路径中所有可用并以 Kt 为后缀的类以访问所有 global 函数。然而,由于 jvm 类加载器的性质,这涉及到更多,如 this answer 中所述。 .

关于reflection - 在 Kotlin 中按名称动态获取函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34824324/

相关文章:

android - 调用 requiresPermission 注释方法时缺少权限提示

c# - 比较两个 FieldInfo 实例的最可靠方法是什么?

JRuby 中的 Java 反射 : Determining class of java. util.regex.Pattern

c# - (C#) 如何根据name字段存值?

Kotlin 如何在 kotlin 中使用 java 流 .map() 来映射不同的对象响应

lambda - Null 或空 lambda 作为默认值

java - 为什么 kotlin 中的属性覆盖使主构造函数属性为零

java - 为什么反射找不到带有 boolean 参数的方法?

c++ - 仅为派生类启用模板化基类

启用 Jacoco 时,具有默认方法的 Java 8 接口(interface)不起作用