有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Kotlin:相当于KClass的getClass()

在Java中,我们可以通过类似getClass()something.getClass()解析变量的类。在科特林,我知道something.javaClass这很好,但我希望能够以类似的方式获得KClass。我见过Something::class语法,但这不是我需要的。我需要得到一个变量的KClass。这种功能存在吗


共 (4) 个答案

  1. # 1 楼答案

    自Kotlin 1.1以来,实现这一点的最简单方法是class reference syntax

    something::class
    

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

    something.javaClass.kotlin
    
  2. # 2 楼答案

    这是我的解决方案

    val TAG = javaClass.simpleName
    

    用javaClass。simpleName您可以获得您的类名。此外,上面的示例对于android开发人员非常有用,可以在类的顶部声明为实例变量,用于日志记录

  3. # 3 楼答案

    自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

  4. # 4 楼答案

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