给予
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
}
)
但是,与反射不同,我似乎不得不使用字符串文字,因为没有反射,就没有将名称转换为字符串的机制。还是有?
答案 0 :(得分:1)
根据the docs,不,您不能通过JS目标中的反射来访问方法。您需要维护自己的function references集合,以实现您在JVM和JS目标中都描述的内容。