Java에서는 다음 getClass()
과 같이 변수의 클래스를 해결할 수 있습니다 something.getClass()
. Kotlin에서 something.javaClass
어떤 것이 좋은지 알고 있지만 KClass
비슷한 방식으로 얻을 수 있기를 원합니다 . 나는 Something::class
구문을 보았지만 이것은 내가 필요한 것이 아닙니다. 변수의 KClass를 가져와야합니다. 그러한 기능이 존재합니까?
답변:
Kotlin 1.1 이후이를 달성하는 가장 쉬운 방법은 클래스 참조 구문입니다 .
something::class
Kotlin 1.0을 사용하는 경우 .kotlin
확장 속성 을 호출하여 얻은 자바 클래스를 KClass 인스턴스로 변환 할 수 있습니다 .
something.javaClass.kotlin
javap
)
KClass::class
하여 현재 클래스 객체를 가져올 수도 있습니다 .
something::class
반환 KClass<out Something>
동안 something.javaClass.kotlin
반환KClass<Something>
편집 : 아래의 주석을 참조하고 위의 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}")
java
비트 를 건너 뛰고 바로 Kotlin으로 이동할 수 있습니다 .fun<T: Any> T.getClass(): KClass<out T> = this::class
someClass::class
다음은 클래스 이름을 얻기위한 다양한 구현입니다. 요구 사항에 따라 활용할 수 있습니다.
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
}