Котлін: еквівалент getClass () для KClass


92

У Java ми можемо вирішити клас змінної через getClass()like something.getClass(). У Котліні я знаю, something.javaClassщо це приємно, але я хочу мати можливість отримати KClassподібний спосіб. Я бачив Something::classсинтаксис, але це не те, що мені потрібно. Мені потрібно отримати KClass змінної. Чи існує така функціональність?

Відповіді:


142

Найпростіший спосіб досягти цього, оскільки Kotlin 1.1 - це синтаксис посилань на клас :

something::class

Якщо ви використовуєте Kotlin 1.0, ви можете перетворити отриманий клас Java на екземпляр KClass, викликавши .kotlinвластивість розширення:

something.javaClass.kotlin

У будь-якому місці, де я можу стежити за виконанням чогось :: класу?
Нішад

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 не поточний об'єкт класу! Щоб його отримати, вам слід скористатися цим :: class.
Markus Kreusch

11

EDIT: Див. Коментарі нижче та відповідь Олександра вище. Ця порада спочатку була для 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
}

Тут ми можемо отримати назву класу в kotlin

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

Тут ми можемо отримати назву класу в kotlin

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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.