Получение 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().


