Kotlin:相当于 KClass 的 getClass()

Kotlin: Equivalent of getClass() for KClass

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

自 Kotlin 1.1 以来实现此目的的最简单方法是 class reference syntax:

something::class

如果使用Kotlin 1.0,可以通过调用.kotlin扩展属性:

将得到的Javaclass转换为KClass实例
something.javaClass.kotlin

编辑:请参阅下面的评论和上面亚历山大的回答。这个建议最初是针对 Kotlin 1.0 的,现在似乎已经过时了。

由于该语言尚不支持直接获取此方法,consider defining an extension method for now

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}")

这是我的解决方案

val TAG = javaClass.simpleName

使用 javaClass.simpleName 你可以获得你的 class 名字。此外,上面的示例对于 android 开发人员在 class 之上声明为用于日志目的的实例变量非常有用。

以下是获取 class 名称的不同实现。您可以根据需要使用它。

import kotlin.reflect.KClass

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

这里我们可以得到kotlin中的class名称

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

这里我们可以得到kotlin中的class名称

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
}

在 Kotlin 中:

val className = serviceClass.javaClass.name

从 Kotlin 1.5.21 开始(org.jetbrains.kotlin:kotlin-stdlib:1.5.21)

val TAG = javaClass.simpleName will work no more!

错误“没有足够的信息来推断类型变量 T”

/**
 * Returns the runtime Java class of this object.
 */
public inline val <T : Any> T.javaClass: Class<T>
    @Suppress("UsePropertyAccessSyntax")
    get() = (this as java.lang.Object).getClass() as Class<T>

@Deprecated("Use 'java' property to get Java class corresponding to this Kotlin class or cast this instance to Any if you really want to get the runtime Java class of this implementation of KClass.", ReplaceWith("(this as Any).javaClass"), level = DeprecationLevel.ERROR)
public inline val <T : Any> KClass<T>.javaClass: Class<KClass<T>>
    @JvmName("getRuntimeClassOfKClassInstance")
    @Suppress("UsePropertyAccessSyntax")
    get() = (this as java.lang.Object).getClass() as Class<KClass<T>>

您现在可以试试 YourClassName::class.java.simpleName