Kotlin: เทียบเท่ากับ getClass () สำหรับ KClass


95

ใน Java เราสามารถแก้ปัญหาระดับของตัวแปรผ่านเช่นgetClass() something.getClass()ใน Kotlin ฉันรู้ว่าsomething.javaClassสิ่งไหนดี แต่ฉันก็อยากจะได้KClassในลักษณะเดียวกัน ฉันเคยเห็นSomething::classไวยากรณ์ แต่นี่ไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการรับ KClass ของตัวแปร ฟังก์ชันดังกล่าวมีอยู่จริงหรือไม่?

คำตอบ:


145

วิธีที่ง่ายที่สุดในการบรรลุสิ่งนี้เนื่องจาก Kotlin 1.1 คือไวยากรณ์อ้างอิงคลาส :

something::class

หากคุณใช้ Kotlin 1.0 คุณสามารถแปลงคลาส Java ที่ได้รับเป็นอินสแตนซ์ KClass โดยเรียก.kotlinคุณสมบัติส่วนขยาย:

something.javaClass.kotlin

สถานที่ใดที่ฉันสามารถติดตามการใช้งานบางสิ่งได้ :: class?
Nishad

1
@ Nishad สถานที่ที่ง่ายที่สุดคือการดู bytecode ที่สร้างขึ้น (เช่นกับjavap)
Alexander Udalov

2
คุณยังสามารถใช้KClass::classเพื่อรับวัตถุคลาสปัจจุบัน
Saminda Peramuna

1
สิ่งที่ควรทราบก็คือsomething::classผลตอบแทนKClass<out Something>ในขณะที่something.javaClass.kotlinส่งคืนKClass<Something>
KylePlusPlus

1
@SamindaPeramuna นี่ไม่ถูกต้อง KClass :: class ส่งคืนคลาสอ็อบเจ็กต์ kotlin.reflect.KClass ไม่ใช่คลาสอ็อบเจ็กต์ปัจจุบัน! เพื่อให้ได้มาคุณต้องใช้คลาส :: นี้
Markus Kreusch

11

แก้ไข: ดูความคิดเห็นด้านล่างและคำตอบจาก Alexander ด้านบน คำแนะนำนี้เดิมใช้สำหรับ Kotlin 1.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
สูงสุด

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.