Вызов по ссылке в Kotlin
Элемент из memberFunctions имеет тип
KFunction. У него есть call -
универсальный вызов: аргументы передают списком,
как при обычном обращении к методу.
У функции без параметров, кроме скрытого получателя, достаточно передать экземпляр класса одним аргументом:
import kotlin.reflect.full.memberFunctions
class Beacon(val channel: String) {
fun ping(): String = "on:$channel"
}
fun main() {
val pingFn = Beacon::class.memberFunctions
.single { it.name == "ping" }
val unit = Beacon("north")
println(pingFn.call(unit))
}
Если у метода есть параметры, их добавляют после экземпляра в том же порядке, что в объявлении:
import kotlin.reflect.full.memberFunctions
class Beacon(val channel: String) {
fun format(level: Int): String = "$channel:$level"
}
fun main() {
val formatFn = Beacon::class.memberFunctions
.single { it.name == "format" }
val unit = Beacon("east")
println(formatFn.call(unit, 3))
}
Ссылку на функцию можно взять и через
ИмяКласса::имяФункции - тогда поиск
в списке не нужен. Функция call по-прежнему
получает получателя первым аргументом:
class Beacon(val channel: String) {
fun format(level: Int): String = "$channel:$level"
}
fun main() {
val formatFn = Beacon::format
println(formatFn.call(Beacon("west"), 1))
}
Класс Timer хранит строковую метку и
содержит функцию, которая возвращает строку
"tick-" с этой меткой в конце. Найдите
функцию через рефлексию и вызовите её через
call для готового экземпляра.
Сделайте класс Mixer с функцией из двух
целых параметров, возвращающей их сумму. Вызовите
метод по ссылке KFunction с аргументами
2 и 5 и выведите результат.