Kotlin: Setara dengan getClass () untuk KClass

95

Di Java kita bisa menyelesaikan kelas variabel melalui getClass()like something.getClass(). Di Kotlin saya tahu something.javaClassmana yang bagus tapi saya ingin bisa mendapatkannya dengan KClasscara yang sama. Saya telah melihat Something::classsintaksnya tetapi ini bukan yang saya butuhkan. Saya perlu mendapatkan KClass dari variabel. Apakah fungsi seperti itu ada?

Jire
sumber

Jawaban:

145

Cara termudah untuk mencapai ini karena Kotlin 1.1 adalah sintaks referensi kelas :

something::class

Jika Anda menggunakan Kotlin 1.0, Anda dapat mengonversi kelas Java yang diperoleh menjadi instance KClass dengan memanggil .kotlinproperti ekstensi:

something.javaClass.kotlin
Alexander Udalov
sumber
Di mana saja saya dapat mengikuti implementasi sesuatu :: class?
Nishad
1
@Nishad Tempat termudah adalah melihat bytecode yang dihasilkan (misalnya dengan javap)
Alexander Udalov
2
Anda juga bisa menggunakan KClass::classuntuk mendapatkan objek kelas saat ini.
Saminda Peramuna
1
Sesuatu yang perlu diperhatikan adalah bahwa something::classpengembalian KClass<out Something>sementara something.javaClass.kotlinpengembalianKClass<Something>
KylePlusPlus
1
@SamindaPeramuna Ini salah, KClass :: class mengembalikan objek kelas kotlin.reflect.KClass bukan objek kelas saat ini! Untuk mendapatkannya Anda harus menggunakan :: class ini.
Markus Kreusch
11

EDIT: Lihat komentar, di bawah, dan jawaban dari Alexander, di atas. Saran ini awalnya untuk Kotlin 1.0 dan sekarang tampaknya sudah usang.

Karena bahasa tersebut belum mendukung cara langsung untuk mendapatkannya, pertimbangkan untuk menentukan metode ekstensi untuk saat ini .

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

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

Atau, jika Anda lebih suka properti:

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

val test = 0
println("Kotlin type: ${test.kClass}")
dherman
sumber
1
Anda dapat melewati javasedikit dan langsung ke Kotlin:fun<T: Any> T.getClass(): KClass<out T> = this::class
TWiStErRob
1
Jawaban ini harus diperbarui untuk mencerminkan perubahan di 1.1. Sekarang dimungkinkan untuk mendapatkan kelas menggunakansomeClass::class
Maks
2

Inilah solusi saya

val TAG = javaClass.simpleName

Dengan javaClass.simpleName Anda bisa mendapatkan nama kelas Anda. Juga contoh di atas sangat berguna bagi pengembang android untuk mendeklarasikan di atas kelas sebagai variabel instance untuk tujuan logging.

Kashif Anwaar
sumber
1

Berikut adalah Implementasi yang berbeda untuk mendapatkan nama kelas. Anda dapat menggunakannya sesuai kebutuhan Anda.

import kotlin.reflect.KClass

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

Di sini kita bisa mendapatkan nama kelas di kotlin

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

Di sini kita bisa mendapatkan nama kelas di kotlin

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

Berikut adalah keluaran dari operasi berikut.

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
sumber