Учитывая
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 - это язык с динамической типизацией, поэтому мой вопрос в том, реализован ли он там.
В качестве альтернативы, я могу иметь коллекцию или карту этих функций.Каков будет самый элегантный синтаксис определения списка функций и их динамического вызова?Например, учитывая несколько атрибутов типа enum, я могу создать несколько булевых методов, подобных этому
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
}
)
Однако, в отличие от отражения, мне, похоже, приходится использовать строковые литералы, потому что без отражения нет механизма переводаимя в строку.Или есть?