Kotlin: эквивалент getClass () для KClass

93

В Java мы можем разрешить класс переменной через getClass()like something.getClass(). В Kotlin я знаю, something.javaClassчто приятно, но я хочу получить возможность KClassаналогичным образом. Я видел Something::classсинтаксис, но это не то, что мне нужно. Мне нужно получить KClass переменной. Такой функционал существует?

Jire
источник

Ответы:

143

Самый простой способ добиться этого, поскольку Kotlin 1.1 - это синтаксис ссылки на класс :

something::class

Если вы используете Kotlin 1.0, вы можете преобразовать полученный класс Java в экземпляр KClass, вызвав .kotlinсвойство extension:

something.javaClass.kotlin
Александр Удалов
источник
В любом месте я могу проследить за реализацией something :: class?
Nishad
1
@Nishad Самым простым местом было бы посмотреть сгенерированный байт-код (например, с javap)
Александр Удалов
2
Вы также можете использовать KClass::classдля получения текущего объекта класса.
Саминда Перамуна
1
Следует отметить, что something::classвозвращается KClass<out Something>при something.javaClass.kotlinвозвратеKClass<Something>
KylePlusPlus
1
@SamindaPeramuna Это просто неправильно, KClass :: class возвращает объект класса kotlin.reflect.KClass, а не текущий объект класса! Чтобы получить это, вам нужно использовать this :: class.
Маркус Кройш
11

РЕДАКТИРОВАТЬ: см. Комментарии ниже и ответ Александра выше. Этот совет изначально был для Kotlin 1.0, и теперь кажется, что он устарел.

Поскольку язык еще не поддерживает прямой способ получить это, подумайте об определении метода расширения на данный момент .

fun<T: Any> T.getClass(): KClass<T> {
    return javaClass.kotlin
}

val test = 0
println("Kotlin type: ${test.getClass()}")

Или, если вы предпочитаете недвижимость:

val<T: Any> T.kClass: KClass<T>
    get() = javaClass.kotlin

val test = 0
println("Kotlin type: ${test.kClass}")
дхерман
источник
1
Вы можете пропустить javaбит и пойти прямо, Котлин:fun<T: Any> T.getClass(): KClass<out T> = this::class
TWiStErRob
1
Этот ответ следует обновить, чтобы отразить изменения в 1.1. Теперь можно получить класс, используяsomeClass::class
Макс
2

Вот мое решение

val TAG = javaClass.simpleName

С помощью javaClass.simpleName вы можете получить имя своего класса. Кроме того, приведенный выше пример очень полезен разработчикам Android для объявления поверх класса в качестве переменной экземпляра для целей ведения журнала.

Кашиф Анваар
источник
1

Вот различные реализации для получения имен классов. Вы можете использовать его в соответствии с вашими требованиями.

import kotlin.reflect.KClass

val <T : Any > T.kClassName: KClass<out T>
get() {
    return javaClass.kotlin
}

Здесь мы можем получить имя класса в котлине

val <T : Any > T.classNameKotlin: String?
get() {
    return javaClass.kotlin.simpleName
}

Здесь мы можем получить имя класса в котлине

val <T : Any > T.classNameJava: String
get() {
    return javaClass.simpleName
}

Вот результаты следующих операций.

fun main(){

val userAge = 0

println(userAge.kClassName) 
Output: class java.lang.Integer (Kotlin reflection is not available)

println(userAge.classNameKotlin)
Output: Int

println(userAge.classNameJava)
Output: Integer
}
Мухаммад Максуд
источник