Kotlin:等效于KClass的getClass()


92

在Java中,我们可以通过getClass()like解析变量的类something.getClass()。在Kotlin中,我知道something.javaClass哪个很好,但我希望能够以KClass类似的方式获得。我已经看过Something::class语法了,但这不是我所需要的。我需要获取变量的KClass。是否存在这样的功能?

Answers:


142

自Kotlin 1.1以来,最简单的方法是使用类引用语法

something::class

如果使用Kotlin 1.0,则可以通过调用.kotlinextension属性将获得的Java类转换为KClass实例:

something.javaClass.kotlin

我可以在任何地方跟随某事的实现:: class吗?
Nishad

1
@Nishad最简单的地方是查看生成的字节码(例如使用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不是当前的类对象!要获得它,您必须使用this :: class。
Markus Kreusch

11

编辑:请参阅下面的评论,以及上面亚历山大的回答。该建议最初是针对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
您可以略过javafun<T: Any> T.getClass(): KClass<out T> = this::class
而后

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
}

在这里我们可以得到科特林的班级名称

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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.