Kotlin:KClassのgetClass()と同等


96

Javaでは、のgetClass()ように変数のクラスを解決できますsomething.getClass()。Kotlinでは、something.javaClassどちらが優れているかを認識していますがKClass、同様の方法で取得できるようにしたいと考えています。Something::class構文を見てきましたが、これは私が必要としているものではありません。変数のKClassを取得する必要があります。そのような機能は存在しますか?

回答:


149

Kotlin 1.1以降、これを実現する最も簡単な方法は、クラス参照構文です。

something::class

Kotlin 1.0を使用している場合は、.kotlin拡張プロパティを呼び出すことで、取得したJavaクラスをKClassインスタンスに変換できます。

something.javaClass.kotlin

何か::クラスの実装を追跡できる場所はどこですか?
ニシャッド2016

1
@Nishad最も簡単な場所は、生成されたバイトコードを確認することです(例:with javap
Alexander Udalov 2016

2
を使用KClass::classして、現在のクラスオブジェクトを取得することもできます。
サミンダペラムナ

1
ノートに何かがそれでsomething::class戻ってKClass<out Something>しばらくsomething.javaClass.kotlin戻っKClass<Something>
KylePlusPlus

1
@SamindaPeramunaこれは間違っています。KClass:: classは、現在のクラスオブジェクトではなくクラスオブジェクトkotlin.reflect.KClassを返します。これを取得するには、this :: classを使用する必要があります。
MarkusKreusch20年

11

編集:以下のコメントと、上記のアレクサンダーからの回答を参照してください。このアドバイスは元々Kotlin1.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:ビットを、まっすぐKotlinを行くfun<T: Any> T.getClass(): KClass<out T> = this::class
TWiStErRob

1
この回答は、1.1での変更を反映するように更新する必要があります。これで、次を使用してクラスを取得できますsomeClass::class
Max

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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.