Получение KClass объекта в Kotlin: аналог getClass()
Быстрый ответ
Чтобы получить KClass
объекта в Kotlin, используйте ::class
:
val kClass = MyClass()::class // получаем KClass
Для преобразования KClass
в Java Class
, добавьте .java
:
val javaClass = MyClass()::class.java // переходим к Java Class
Итак, ::class
возвращает KClass
, а .java
преобразует его в Java Class
.
Для получения простого имени KClass (например, для логов), используйте:
val className = MyClass::class.java.simpleName // получаем имя для логирования
Исторический обзор Kotlin: от версии 1.0 до 1.1 и более новых
Вслед за развитием Kotlin его возможности постоянно расширялись.
Kotlin 1.0: Эпоха '.kotlin'
В начале эпохи Kotlin 1.0, для получения KClass
из Java Class
требовалось использование расширения .kotlin
:
val kClass = MyClass().javaClass.kotlin // преобразуем Java Class в KClass
Однако в более поздних версиях Kotlin от этого метода отказались.
Kotlin 1.1 и более новые версии: Введение '::class'
С внедрением версии Kotlin 1.1 использование ::class
значительно упростило процесс:
val kClass = MyClass::class // работает напрямую, без использования javaClass
Kotlin 1.5.21 и более новые версии: Прогресс идёт вперёд
В версии Kotlin 1.5.21 представлен более эффективный способ работы с Java-классами через KClass
. Небольшой секрет для инициативных: выражение (YourClassName as Any).javaClass
возвращает Java-класс без прямого использования KClass<>.javaClass
.
Визуализация
Для понимания аналога Java getClass()
в Kotlin представим следующее сравнение:
Java-детектив (🕵️♂️) требует: "Ваш класс, пожалуйста?"
Субъект предъявляет УДОСТОВЕРЕНИЕ (🆔): getClass()
Kotlin-агент (🕵️♀️) повторяет вопрос и получает цифровое удостоверение (💳): .java
Таким образом, в Kotlin:
val personKClass: KClass<Person> = Person::class
val personJavaClass: Class<Person> = personKClass.java // 💳 это цифровое удостоверение!
Ключевой момент состоит в том, что так же, как детектив опознает личность, .java
в Kotlin получает Java Class
из KClass
.
Практическое использование notation '::class'
Разберем использование ::class
на практических примерах.
Использование обобщений и параметров типов
Когда стандартные методы приводят к ошибке вывода переменной типа T, ::class
приходит на помощь:
inline fun <reified T: Any> printGenericClassInfo() {
println(T::class.java.simpleName) // все упорядочено
}
printGenericClassInfo<MyClass>() // MyClass на месте
TAG в логировании Android
Для создания TAG
в Android-логах рекомендуется использовать следующий метод:
companion object {
val TAG = MyClass::class.java.simpleName // готовы к логированию
}
Этот подход предлагает рациональное решение.
Рефлексия и реальные экземпляры
Для исследования экземпляров в реальном времени ::class
будет незаменим:
val myObject = MyClass()
val kClass = myObject::class // KClass в динамике
Полезные материалы
- Рефлексия | Документация Kotlin — Прекрасный ресурс для понимания рефлексии в Kotlin и функциональной аналогии
getClass()
. - KClass – Язык программирования Kotlin — Здесь подробно описан
KClass
, аналог JavaClass
для Kotlin. - Вызов Java из Kotlin | Документация Kotlin — Описывает взаимодействие между Java и Kotlin, включая рефлексию.
- Kotlin Playground: редактирование, выполнение, обмен кодом на Kotlin онлайн — Этот ресурс позволит вам практически опробовать рефлексию Kotlin и Java.
- Делегированные свойства | Документация Kotlin — Учит работе со свойствами в Kotlin, что косвенно помогает понять рефлексию и
getClass()
.