Kotlin: KClass के लिए getClass () के बराबर


92

जावा में हम getClass()जैसे के माध्यम से एक चर वर्ग को हल कर सकते हैं something.getClass()। कोटलिन में मुझे पता है कि something.javaClassकौन सा अच्छा है लेकिन मैं KClassएक समान तरीके से सक्षम होना चाहता हूं । मैंने Something::classसिंटैक्स देखा है लेकिन यह वह नहीं है जिसकी मुझे आवश्यकता है। मुझे एक चर का क्लक्स प्राप्त करने की आवश्यकता है। क्या ऐसी कार्यक्षमता मौजूद है?

जवाबों:


142

कोटलिन 1.1 के बाद से इसे प्राप्त करने का सबसे आसान तरीका वर्ग संदर्भ वाक्यविन्यास है :

something::class

यदि आप कोटलीन 1.0 का उपयोग करते हैं, तो आप .kotlinएक्सटेंशन संपत्ति को कॉल करके प्राप्त जावा वर्ग को क्क्लास उदाहरण में परिवर्तित कर सकते हैं:

something.javaClass.kotlin

किसी भी जगह मैं कुछ के कार्यान्वयन का पालन कर सकता हूँ :: वर्ग?
निषाद

1
@ निषाद सबसे आसान जगह उत्पन्न बाईटेकोड (जैसे के साथ javap) को देखने के लिए होगा
अलेक्जेंडर उडालोव

2
आप KClass::classवर्तमान क्लास ऑब्जेक्ट प्राप्त करने के लिए भी उपयोग कर सकते हैं ।
समिंडा पेरमुना

1
ध्यान देने योग्य बात यह है कि something::classरिटर्न KClass<out Something>करते समय something.javaClass.kotlinरिटर्नKClass<Something>
KylePlusPlus

1
@SamindaPeramuna यह सिर्फ गलत है, KClass :: क्लास क्लास ऑब्जेक्ट देता है kotlin.reflect.KClass वर्तमान क्लास ऑब्जेक्ट नहीं! इसे पाने के लिए आपको यह प्रयोग करना होगा :: वर्ग।
मार्कस क्रेउश

11

संपादित करें: नीचे, और नीचे सिकंदर के जवाब देखें। यह सलाह मूल रूप से कोटलिन 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बिट को छोड़ सकते हैं और सीधे fun<T: Any> T.getClass(): KClass<out T> = this::class
कोटलिन

1
इस उत्तर को 1.1 में हुए परिवर्तनों को दर्शाने के लिए अद्यतन किया जाना चाहिए। अब कक्षा का उपयोग करना संभव हैsomeClass::class
मैक्स

2

यहाँ मेरा समाधान है

val TAG = javaClass.simpleName

JavaClass.simpleName से आप अपने वर्ग का नाम प्राप्त कर सकते हैं। इसके अलावा उपरोक्त उदाहरण एंड्रॉइड डेवलपर्स के लिए लॉगिंग उद्देश्यों के लिए एक उदाहरण चर के रूप में कक्षा के शीर्ष पर घोषित करने के लिए बहुत उपयोगी है।


1

यहाँ वर्ग नाम प्राप्त करने के लिए अलग-अलग कार्यान्वयन हैं। आप अपनी आवश्यकताओं के अनुसार इसका उपयोग कर सकते हैं।

import kotlin.reflect.KClass

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

यहाँ हम कोटलिन में वर्ग का नाम प्राप्त कर सकते हैं

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

यहाँ हम कोटलिन में वर्ग का नाम प्राप्त कर सकते हैं

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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.