Kotlin: équivalent de getClass () pour KClass

93

En Java, nous pouvons résoudre la classe d'une variable via getClass()like something.getClass(). À Kotlin, je sais something.javaClassce qui est bien, mais je veux pouvoir l'obtenir de la KClassmême manière. J'ai vu la Something::classsyntaxe mais ce n'est pas ce dont j'ai besoin. J'ai besoin d'obtenir la KClass d'une variable. Une telle fonctionnalité existe-t-elle?

Jire
la source

Réponses:

143

Le moyen le plus simple d'y parvenir depuis Kotlin 1.1 est la syntaxe de référence de classe :

something::class

Si vous utilisez Kotlin 1.0, vous pouvez convertir la classe Java obtenue en une instance KClass en appelant la .kotlinpropriété d'extension:

something.javaClass.kotlin
Alexandre Udalov
la source
N'importe quel endroit où je peux suivre l'implémentation de something :: class?
Nishad le
1
@Nishad L'endroit le plus simple serait de regarder le bytecode généré (par exemple avec javap)
Alexander Udalov
2
Vous pouvez également utiliser KClass::classpour obtenir l'objet de classe actuel.
Saminda Peramuna
1
Quelque chose à noter est que something::classrevient KClass<out Something>pendant le something.javaClass.kotlinretourKClass<Something>
KylePlusPlus
1
@SamindaPeramuna C'est tout simplement faux, KClass :: class renvoie l'objet de classe kotlin.reflect.KClass et non l'objet de classe actuel! Pour l'obtenir, vous devez utiliser this :: class.
Markus Kreusch le
11

EDIT: Voir les commentaires, ci-dessous, et la réponse d'Alexandre, ci-dessus. Ce conseil était à l'origine pour Kotlin 1.0 et il semble maintenant obsolète.

Étant donné que le langage ne prend pas encore en charge un moyen direct pour obtenir cela, envisagez de définir une méthode d'extension pour le moment .

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

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

Ou, si vous préférez une propriété:

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

val test = 0
println("Kotlin type: ${test.kClass}")
Dherman
la source
1
Vous pouvez sauter le javabit et aller tout droit Kotlin:fun<T: Any> T.getClass(): KClass<out T> = this::class
TWiStErRob
1
Cette réponse doit être mise à jour pour refléter les changements de 1.1. Maintenant, il est possible d'obtenir la classe en utilisantsomeClass::class
Max
2

Voici ma solution

val TAG = javaClass.simpleName

Avec javaClass.simpleName, vous pouvez obtenir votre nom de classe. De plus, l'exemple ci-dessus est très utile pour les développeurs Android à déclarer en haut de la classe en tant que variable d'instance à des fins de journalisation.

Kashif Anwaar
la source
1

Voici différentes implémentations pour obtenir les noms de classe. Vous pouvez l'utiliser selon vos besoins.

import kotlin.reflect.KClass

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

Ici, nous pouvons obtenir le nom de la classe en kotlin

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

Ici, nous pouvons obtenir le nom de la classe en kotlin

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

Voici les sorties des opérations suivantes.

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
}
Muhammad Maqsood
la source