Kotlin отражение / динамический вызов функции в многоплатформенной среде - PullRequest
1 голос
/ 28 марта 2019

Учитывая

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

Однако, в отличие от отражения, мне, похоже, приходится использовать строковые литералы, потому что без отражения нет механизма переводаимя в строку.Или есть?

1 Ответ

1 голос
/ 28 марта 2019

Согласно документам , нет, вы не можете получить доступ к методам через отражение в цели JS.Вам нужно будет поддерживать собственную коллекцию ссылок на функции , чтобы достичь того, что вы описываете для целей JVM и JS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...