Kotlin: KClass 的 getClass()的等价物

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

108815 次浏览

自 Kotlin 1.1以来,实现这个目标最简单的方法是 类引用语法:

something::class

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

something.javaClass.kotlin

编辑: 见下面的评论和上面亚历山大的回答。这个建议最初是针对 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}")

这是我的解决办法

val TAG = javaClass.simpleName

使用 javaClass.simpleName 可以获得类名。对于 android 开发人员来说,上面的例子非常有用,可以在类的顶部声明一个用于日志记录的实例变量。

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

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
}

在 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