Рефлексия (отражение) в Kotlin — это набор языковых и библиотечных функций, которые исследуют структуру программы во время выполнения. Kotlin делает функции и свойства первоклассными объектами языка и проверяет эти функции и свойства во время выполнения.
Ссылка на класс
Reference используется для получения ссылки на объект KClass. Чтобы получить ссылку на статический Kclass, мы должны использовать литерал класса (т.е. использовать двойное двоеточие).
Синтаксис ссылки на класс:
val c1 = String::class val c2 = MyClass::class
Ссылочное значение является типом класса KClass. Ссылка на класс KClass отличается от ссылки на класс Java. Мы получаем ссылку на класс Java, используя свойство .java в экземпляре KClass.
Примечание. KClass представляет собой класс и предоставляет возможности проверки. Чтобы получить экземпляр этого класса, используйте синтаксис ::class.
Функциональный справочник
functional Kotlin используется для получения ссылки на функцию с помощью двойного двоеточия. Ссылка на функцию может использоваться в другой функции в качестве параметра. Чтобы использовать эту ссылку в другой функции, мы используем оператор(::):
fun isPositive(x: Int) = x> 0
fun isPositive(x: Int) = x> 0 val number = listOf(-10,-5,0,5,10) print(number.filter(::isPositive))
Функциональный эталонный пример Kotlin
fun main(args: Array) {
fun isPositive(x: Int) = x > 0
val numbers = listOf(-10, -5, 0, 5, 10)
println(numbers.filter(::isPositive))
}
Выход:
[5,10]
В приведенной выше программе ::isPositive является значением функционального типа(Int) -> Boolean.
Оператор ссылки на перегруженную функцию(::)
Оператор :: можно использовать с функцией перегрузки, когда ожидаемый тип известен из контекста. Например:
Создайте функцию isPositive() в Котлин, которая принимает два разных типа Int и String, и вызовите эту функцию с параметром другого типа.
fun main(args: Array) {
fun isPositive(x: Int) = x > 0
fun isPositive(s: String) = s== "kotlin" || s == "Kotlin"
val numbers = listOf(-10,-5,0,5,10)
val strings = listOf("kotlin", "program")
println(numbers.filter(::isPositive))
println(strings.filter(::isPositive))
}
Выход:
[5, 10] [kotlin]
Справочник по свойствам
Мы также можем получить доступ к свойствам как к объекту первого класса в Kotlin, чтобы получить доступ к свойству объекта, мы можем использовать :: оператор:
Чтобы оценить объект свойства типа KProperty, мы используем выражение ::variableName. Выражение ::variableName позволяет получить имя своего свойства, используя имя и считывает значение, используя функцию get().
Чтобы сбросить значение свойства изменяемого типа, ссылочное свойство имеет метод set().
fun main(args: Array) {
println(::x.get())
println(::x.name)
println(::y.set(10))
}
val x = 5
var y = 5
Выход:
5 x 10
Доступ к свойству класса-члена
Ссылка на свойство также обращается к свойству другого члена класса. Например:
class A(val x: Int)
fun main(args: Array) {
val prop = A::x
println(prop.get(A(5)))
}
Выход:
5
