Kotlin : KClass의 getClass ()와 동일


92

Java에서는 다음 getClass()과 같이 변수의 클래스를 해결할 수 있습니다 something.getClass(). Kotlin에서 something.javaClass어떤 것이 좋은지 알고 있지만 KClass비슷한 방식으로 얻을 수 있기를 원합니다 . 나는 Something::class구문을 보았지만 이것은 내가 필요한 것이 아닙니다. 변수의 KClass를 가져와야합니다. 그러한 기능이 존재합니까?

답변:


142

Kotlin 1.1 이후이를 달성하는 가장 쉬운 방법은 클래스 참조 구문입니다 .

something::class

Kotlin 1.0을 사용하는 경우 .kotlin확장 속성 을 호출하여 얻은 자바 클래스를 KClass 인스턴스로 변환 할 수 있습니다 .

something.javaClass.kotlin

something :: class의 구현을 따를 수있는 곳은 어디입니까?
Nishad

1
@Nishad 가장 쉬운 장소 (예와 생성 된 바이트 코드를보고하는 것 javap)
알렉산더 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 클래스 객체를 반환합니다! 그것을 얻으려면 this :: class를 사용해야합니다.
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
Max

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.