多平台环境中的Kotlin反射/动态函数调用

时间:2019-03-27 23:55:56

标签: kotlin

给予

class X {
    fun f() {...}
    fun g() {...}
    ...
}

我想按名称调用f,g或其他类函数,该函数在运行时动态已知。例如,通过Kotlin反射可以做到这一点。

val callback : KCallable<*>? = X::class.members.firstOrNull { it.name == predVar }
if (callback != null) {
    callback.call(obj, ...)

这里唯一的困扰是我的多平台应用程序具有除JVM之外的目标。例如,kotlin反射在javascript中可行吗?当然,JS是动态类型的语言,因此我的问题是它是否已在其中实现。

或者,我可以拥有这些功能的集合或地图。定义函数列表并使它们可动态调用的最优雅的语法是什么?例如,给定几个枚举类型属性,我可以创建一堆这样的布尔方法

var booleanDerivatives = hashMapOf<String, () -> Boolean>(
    "breaksAfterComma" to fun (): Boolean {
        return options[breaksComma] === Breaks.After
    }
    ,"breaksBeforeComma" to fun (): Boolean {
        return options[breaksComma] === Breaks.Before
    }
    ,"breaksAfterLogicalConjunction" to fun (): Boolean {
        return options[breaksAroundLogicalConjunctions] === Breaks.After 
            || options[breaksAroundLogicalConjunctions] === Breaks.BeforeAndAfter
    }
)

但是,与反射不同,我似乎不得不使用字符串文字,因为没有反射,就没有将名称转换为字符串的机制。还是有?

1 个答案:

答案 0 :(得分:1)

根据the docs,不,您不能通过JS目标中的反射来访问方法。您需要维护自己的function references集合,以实现您在JVM和JS目标中都描述的内容。