Рефлексия Kotlin: KClass, KFunction, KProperty
Изучайте метаданные классов с помощью KClass и проверяйте их элементы посредством рефлексии.
«Рефлексия Kotlin: KClass, KFunction, KProperty» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Что такое рефлексия
Рефлексия позволяет коду во время выполнения исследовать и вызывать собственную структуру: классы, функции, свойства, аннотации и конструкторы. Kotlin оборачивает API рефлексии JVM в собственные более богатые типы пакета kotlin.reflect.
Получение KClass
Используйте ::class для типа или экземпляра, чтобы получить ссылку KClass:
val klass: KClass<String> = String::class
val instance: KClass<out Any> = "hello"::class
println(klass.simpleName) // "String"Свойства KClass
KClass предоставляет метаданные о классе:
val klass = String::class
println(klass.simpleName) // "String"
println(klass.qualifiedName) // "kotlin.String"
println(klass.isAbstract) // false
println(klass.constructors.size) // number of constructorsKFunction: ссылки на вызываемые элементы
Используйте ::functionName, чтобы получить ссылку KFunction. Вы можете исследовать её параметры и вызвать её:
fun greet(name: String) = "Hello, $name!"
val fn: KFunction<String> = ::greet
println(fn.name) // "greet"
println(fn.call("Kotlin")) // "Hello, Kotlin!"Исследование параметров
KFunction.parameters возвращает список объектов KParameter с именем, типом и признаком необязательности:
fun add(a: Int, b: Int) = a + b
::add.parameters.forEach {
println("${it.name}: ${it.type}")
}
// a: kotlin.Int
// b: kotlin.IntKProperty: ссылки на свойства
Ссылки на свойства представляют свойство как самостоятельный объект. KProperty0 используется для свойств без получателя, а KProperty1 — для свойств-членов.
data class User(val name: String, val age: Int)
val prop: KProperty1<User, String> = User::name
val user = User("Alice", 30)
println(prop.get(user)) // "Alice"Изменяемые свойства с помощью KMutableProperty
Для свойств var ссылка имеет тип KMutableProperty1, который также содержит функцию set:
class Box(var value: Int)
val prop: KMutableProperty1<Box, Int> = Box::value
val box = Box(10)
prop.set(box, 42)
println(box.value) // 42Перечисление всех членов
KClass.members возвращает все видимые члены (функции и свойства). KClass.declaredMemberProperties возвращает только свойства, объявленные в этом классе.
data class Point(val x: Int, val y: Int)
Point::class.declaredMemberProperties.forEach {
println(it.name) // "x", "y"
}Создание экземпляров с помощью KClass
Вызовите KClass.createInstance() (требуется конструктор без аргументов) или используйте KClass.constructors для полного контроля:
class Counter {
var count = 0
}
val c = Counter::class.createInstance()
c.count = 5
println(c.count) // 5Зависимость для рефлексии Kotlin
Для рефлексии Kotlin требуется артефакт kotlin-reflect (он не входит в стандартную библиотеку). Добавьте его в сборку:
// build.gradle.kts
implementation("org.jetbrains.kotlin:kotlin-reflect")Примечание о производительности
Рефлексия значительно медленнее прямого кода. Кэшируйте ссылки KClass, KFunction и KProperty при запуске. Не вызывайте их в горячих циклах. Для большинства инструментов и кода инфраструктуры эти затраты приемлемы.
Быстрая проверка
Какой тип Kotlin представляет ссылку на свойство-член и позволяет прочитать его значение из экземпляра?
Повторение: рефлексия Kotlin
Основные типы:
KClass— метаданные класса, конструкторы и членыKFunction— ссылки на вызываемые элементы, параметры и вызовKProperty1/KMutableProperty1— ссылки на свойства, получение и установка значения- Требуется
kotlin-reflectв пути к классам - Кэшируйте ссылки и избегайте их использования на горячих путях
Часто задаваемые вопросы
Урок «Рефлексия Kotlin: KClass, KFunction, KProperty» бесплатный?
Да — полный текст урока «Рефлексия Kotlin: KClass, KFunction, KProperty» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Рефлексия Kotlin: KClass, KFunction, KProperty»?
Изучайте метаданные классов с помощью KClass и проверяйте их элементы посредством рефлексии. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Рефлексия Kotlin: KClass, KFunction, KProperty»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Рефлексия Kotlin: KClass, KFunction, KProperty
- Создание и применение пользовательских аннотаций
- Чтение аннотаций во время выполнения
- Валидация и отображение на основе рефлексии