我有一个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)
那么有可能辨别科特林的物体是哪个?
答案 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中的任何对象上使用。