Kotlin: KClass için getClass () eşdeğeri


95

Java'da İçinden bir değişkenin sınıfı çözebilir getClass()gibi something.getClass(). Kotlin'de something.javaClasshangisinin güzel olduğunun farkındayım ama KClassbenzer şekilde elde edebilmek istiyorum . Something::classSözdizimini gördüm ama ihtiyacım olan bu değil. Bir değişkenin KClass'ını almam gerekiyor. Böyle bir işlevsellik var mı?

Yanıtlar:


145

Kotlin 1.1'den beri bunu başarmanın en kolay yolu sınıf referans sözdizimi :

something::class

Kotlin 1.0 kullanıyorsanız, .kotlinextension özelliğini çağırarak elde edilen Java sınıfını KClass örneğine dönüştürebilirsiniz :

something.javaClass.kotlin

Bir şeyin uygulanmasını takip edebileceğim herhangi bir yer :: class?
Nishad

1
@Nishad En kolay yer, oluşturulan bayt koduna bakmaktır (örn. javap
İle

2
KClass::classGeçerli sınıf nesnesini almak için de kullanabilirsiniz .
Saminda Peramuna

1
Unutulmaması gereken bir şey, something::classgeri KClass<out Something>dönerken something.javaClass.kotlingeri dönüyorKClass<Something>
KylePlusPlus

1
@SamindaPeramuna Bu sadece yanlış, KClass :: class sınıf nesnesini döndürür kotlin.reflect.KClass mevcut sınıf nesnesini değil! Bunu elde etmek için bu :: class'ı kullanmanız gerekir.
Markus Kreusch

11

DÜZENLEME: Aşağıdaki yorumlara bakın ve yukarıdaki İskender'in yanıtına bakın. Bu tavsiye başlangıçta Kotlin 1.0 içindi ve artık eskimiş görünüyor.

Dil henüz bunu elde etmenin doğrudan bir yolunu desteklemediğinden, şimdilik bir uzantı yöntemi tanımlamayı düşünün .

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

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

Veya bir mülkü tercih ederseniz:

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

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

1
javaBiraz atlayabilir ve düz fun<T: Any> T.getClass(): KClass<out T> = this::class
Kotlin'e

1
Bu cevap, 1.1'deki değişiklikleri yansıtacak şekilde güncellenmelidir. Artık sınıfı kullanmak mümkünsomeClass::class
Max

2

İşte benim çözümüm

val TAG = javaClass.simpleName

JavaClass.simpleName ile sınıf adınızı elde edebilirsiniz. Ayrıca yukarıdaki örnek, android geliştiricilerinin günlük kaydı amacıyla sınıfın en üstünde bir örnek değişkeni olarak bildirmeleri için çok kullanışlıdır.


1

Sınıf adlarını almak için farklı Uygulamalar. Gereksinimlerinize göre kullanabilirsiniz.

import kotlin.reflect.KClass

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

Burada sınıf adını kotlin olarak alabiliriz

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

Burada sınıf adını kotlin olarak alabiliriz

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

İşte aşağıdaki işlemlerin çıktıları.

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.