Kotlin: Entspricht getClass () für KClass

89

In Java können wir die Klasse einer Variablen durch getClass()like auflösen something.getClass(). In Kotlin weiß ich, something.javaClasswas schön ist, aber ich möchte das KClassauf ähnliche Weise bekommen können. Ich habe die Something::classSyntax gesehen, aber das ist nicht das, was ich brauche. Ich muss die KClass einer Variablen erhalten. Gibt es solche Funktionen?

Jire
quelle

Antworten:

135

Der einfachste Weg, dies seit Kotlin 1.1 zu erreichen, ist die Klassenreferenzsyntax :

something::class

Wenn Sie Kotlin 1.0 verwenden, können Sie die erhaltene Java-Klasse in eine KClass-Instanz konvertieren, indem Sie die .kotlinErweiterungseigenschaft aufrufen :

something.javaClass.kotlin
Alexander Udalov
quelle
Gibt es einen Ort, an dem ich die Implementierung von Something :: Class verfolgen kann?
Nishad
1
@ Nishad Der einfachste Ort wäre, den generierten Bytecode (zB mit javap) zu betrachten
Alexander Udalov
2
Sie können auch KClass::classdas aktuelle Klassenobjekt abrufen.
Saminda Peramuna
1
Etwas zu beachten ist, dass something::classzurückkehrt, KClass<out Something>während something.javaClass.kotlinzurückkehrtKClass<Something>
KylePlusPlus
1
@SamindaPeramuna Das ist einfach falsch, KClass :: class gibt das Klassenobjekt kotlin.reflect.KClass zurück, nicht das aktuelle Klassenobjekt! Um es zu bekommen, müssen Sie diese :: Klasse verwenden.
Markus Kreusch
11

EDIT: Siehe Kommentare unten und Antwort von Alexander oben. Dieser Rat war ursprünglich für Kotlin 1.0 und scheint nun veraltet zu sein.

Da die Sprache noch keinen direkten Weg unterstützt, dies zu erreichen, sollten Sie zunächst eine Erweiterungsmethode definieren .

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

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

Oder wenn Sie eine Immobilie bevorzugen:

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

val test = 0
println("Kotlin type: ${test.kClass}")
Dherman
quelle
1
Sie können das javaBit überspringen und geradeaus fahren Kotlin:fun<T: Any> T.getClass(): KClass<out T> = this::class
TWiStErRob
1
Diese Antwort sollte aktualisiert werden, um die Änderungen in 1.1 widerzuspiegeln. Jetzt ist es möglich, die Klasse mitsomeClass::class
Max
2

Hier ist meine Lösung

val TAG = javaClass.simpleName

Mit javaClass.simpleName können Sie Ihren Klassennamen erhalten. Das obige Beispiel ist auch für Android-Entwickler sehr nützlich, um über der Klasse eine Instanzvariable für Protokollierungszwecke zu deklarieren.

Kashif Anwaar
quelle
0

Hier sind verschiedene Implementierungen, um Klassennamen zu erhalten. Sie können es gemäß Ihren Anforderungen verwenden.

import kotlin.reflect.KClass

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

Hier können wir den Klassennamen in Kotlin erhalten

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

Hier können wir den Klassennamen in Kotlin erhalten

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

Hier sind die Ausgaben für die folgenden Operationen.

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
quelle