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

问题描述 投票:1回答:1

特定

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
    }
)

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

kotlin
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.