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?

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

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}")

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.


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
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.