Получение KClass объекта в Kotlin: аналог getClass()

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы получить KClass объекта в Kotlin, используйте ::class:

kotlin
Скопировать код
val kClass = MyClass()::class // получаем KClass

Для преобразования KClass в Java Class, добавьте .java:

kotlin
Скопировать код
val javaClass = MyClass()::class.java // переходим к Java Class

Итак, ::class возвращает KClass, а .java преобразует его в Java Class.

Для получения простого имени KClass (например, для логов), используйте:

kotlin
Скопировать код
val className = MyClass::class.java.simpleName // получаем имя для логирования
Кинга Идем в IT: пошаговый план для смены профессии

Исторический обзор Kotlin: от версии 1.0 до 1.1 и более новых

Вслед за развитием Kotlin его возможности постоянно расширялись.

Kotlin 1.0: Эпоха '.kotlin'

В начале эпохи Kotlin 1.0, для получения KClass из Java Class требовалось использование расширения .kotlin:

kotlin
Скопировать код
val kClass = MyClass().javaClass.kotlin // преобразуем Java Class в KClass

Однако в более поздних версиях Kotlin от этого метода отказались.

Kotlin 1.1 и более новые версии: Введение '::class'

С внедрением версии Kotlin 1.1 использование ::class значительно упростило процесс:

kotlin
Скопировать код
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:

kotlin
Скопировать код
val personKClass: KClass<Person> = Person::class
val personJavaClass: Class<Person> = personKClass.java // 💳 это цифровое удостоверение!

Ключевой момент состоит в том, что так же, как детектив опознает личность, .java в Kotlin получает Java Class из KClass.

Практическое использование notation '::class'

Разберем использование ::class на практических примерах.

Использование обобщений и параметров типов

Когда стандартные методы приводят к ошибке вывода переменной типа T, ::class приходит на помощь:

kotlin
Скопировать код
inline fun <reified T: Any> printGenericClassInfo() {
    println(T::class.java.simpleName) // все упорядочено
}

printGenericClassInfo<MyClass>() // MyClass на месте

TAG в логировании Android

Для создания TAG в Android-логах рекомендуется использовать следующий метод:

kotlin
Скопировать код
companion object {
    val TAG = MyClass::class.java.simpleName // готовы к логированию
}

Этот подход предлагает рациональное решение.

Рефлексия и реальные экземпляры

Для исследования экземпляров в реальном времени ::class будет незаменим:

kotlin
Скопировать код
val myObject = MyClass()
val kClass = myObject::class // KClass в динамике

Полезные материалы

  1. Рефлексия | Документация Kotlin — Прекрасный ресурс для понимания рефлексии в Kotlin и функциональной аналогии getClass().
  2. KClass – Язык программирования Kotlin — Здесь подробно описан KClass, аналог Java Class для Kotlin.
  3. Вызов Java из Kotlin | Документация Kotlin — Описывает взаимодействие между Java и Kotlin, включая рефлексию.
  4. Kotlin Playground: редактирование, выполнение, обмен кодом на Kotlin онлайн — Этот ресурс позволит вам практически опробовать рефлексию Kotlin и Java.
  5. Делегированные свойства | Документация Kotlin — Учит работе со свойствами в Kotlin, что косвенно помогает понять рефлексию и getClass().