কোটলিন: কেসি ক্লাসের জন্য getClass () এর সমতুল্য


94

জাভাতে আমরা getClass()পছন্দ মতো একটি ভেরিয়েবলের ক্লাস সমাধান করতে পারি something.getClass()। কোটলিনে আমি সচেতন something.javaClassযে কোনটি ভাল তবে আমি এটি KClassএকইভাবে পেতে সক্ষম হতে চাই । আমি Something::classসিনট্যাক্সটি দেখেছি তবে এটি আমার প্রয়োজনটি নয়। আমার একটি ভেরিয়েবলের কেসি ক্লাস নেওয়া দরকার। এই জাতীয় কার্যকারিতা কি বিদ্যমান?

উত্তর:


144

সবচেয়ে সহজ উপায় Kotlin 1.1 যেহেতু এই অর্জন করা হল বর্গ রেফারেন্স সিনট্যাক্স :

something::class

আপনি যদি কোটলিন 1.0 ব্যবহার করেন তবে আপনি .kotlinএক্সটেনশন সম্পত্তিটিতে কল করে প্রাপ্ত জাভা শ্রেণিকে কেসি ক্লাসে রূপান্তর করতে পারবেন :

something.javaClass.kotlin

শ্রেণীর কোনও কিছুর প্রয়োগ আমি অনুসরণ করতে পারি: ক্লাস?
নিশাদ

4
@ নিশাদ সবচেয়ে সহজ জায়গাটি জেনারেটেড বাইকোড (উদাহরণস্বরূপ javap) সাথে দেখা হবে
আলেকজান্ডার উদালভ

4
আপনি KClass::classবর্তমান শ্রেণীর অবজেক্টটি পেতে ব্যবহার করতে পারেন।
সামিন্দা পেরামুনা

4
লক্ষণীয় কিছু হ'ল something::classপ্রত্যাবর্তনের KClass<out Something>সময় something.javaClass.kotlinফিরে আসেKClass<Something>
কাইলপ্লাসপ্লাস

4
@ সমিন্দাপেরামুন এটি ঠিক ভুল, কেসি ক্লাস :: ক্লাস ক্লাস অবজেক্টটি কোটলিন.রেফলেক্ট করে। কে ক্লাস বর্তমান ক্লাস অবজেক্ট নয়! এটি পেতে আপনাকে এই :: ক্লাসটি ব্যবহার করতে হবে।
মার্কাস ক্রেউশ

11

সম্পাদনা: নীচে মন্তব্য, নীচে এবং আলেকজান্ডারের উত্তর দেখুন answer এই পরামর্শটি মূলত কোটলিন 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}")

4
আপনি javaকিছুটা এড়িয়ে যেতে পারেন এবং সরাসরি কোটলিন যেতে পারেন:fun<T: Any> T.getClass(): KClass<out T> = this::class
TWiStErRob

4
এই উত্তরটি 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
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.