kotlin:检查类是否为对象类?

时间:2019-03-28 05:49:19

标签: java kotlin

我有一个kotlin对象和一个Java类,如:

KotlinObject.kt

object KotlinObject{
....
}

JavaClass.java

class JavaClass {
...
}

和kotlin函数进行检查:

fun foo(cls: Class<*>): Any {
   if (cls is kotlin's object) { //how to do this?
      return ?  //wanna return object's instance
   } else {
      return cls.newInstance()
   }    
}

我可以将kotlin对象或java类传递给此函数:

foo(KotlinObject::class.java)
foo(JavaClass::class.java)

那么有可能辨别科特林的物体是哪个?

2 个答案:

答案 0 :(得分:3)

感谢@Alexey Romanov在评论中指出,可以从Class<*>获得Kotlin类信息。

fun foo(cls: Class<*>) {
    if (cls.kotlin.objectInstance != null)
        println("KotlinObject")
    else
        println("Other class")
}

我最初的方法是模仿Kotlins KClass.objectInstance

我保留此作为参考,但请使用上面的解决方案。

fun foo(cls: Class<*>) {
    val objectInstance = cls.declaredFields.firstOrNull {
        it.type == cls && it.name == "INSTANCE"
    }

    if (objectInstance != null)
        println("KotlinObject")
    else
        println("Other class")
}

请注意,在这种情况下,任何将Singleton字段使用名称“ INSTANCE”的Java Singleton也将报告为Kotlin对象。

答案 1 :(得分:2)

知道了!

object KotlinObject{}
class JavaClass {}

fun foo(cls: KClass<*>) {
    if (cls.objectInstance != null)
        println("It's a Kotlin object")
    else
        println("It's NOT a Kotlin object")
}

fun main(args: Array<String>) {
    foo(KotlinObject::class)
    foo(JavaClass::class)
}

输出:

It's a Kotlin object
It's NOT a Kotlin object

如果由于某种原因必须通过Java类,那么我想不通任何方法。我认为所有的区别都消失了。

注意:即使在Java文件中定义了JavaClass,此方法也有效。 Kotlin中的每个对象都是KClass类型的,无论其定义方式和定义位置如何。也就是说,:: class可以在Kotlin中的任何对象上使用。