Tengo un objeto kotlin y una clase java como:
KotlinObject.kt
object KotlinObject{ .... }JavaClass.java
class JavaClass { ... }y una función kotlin para verificar:
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() } }Puedo pasar el objeto kotlin o la clase java a esta función:
foo(KotlinObject::class.java) foo(JavaClass::class.java)Entonces, ¿es posible saber cuál es el objeto de Kotlin?
Gracias a @Alexey Romanov por señalar en los comentarios que la información de la clase Kotlin está disponible en Class<*> .
fun foo(cls: Class<*>) { if (cls.kotlin.objectInstance != null) println("KotlinObject") else println("Other class") } Mi enfoque original fue imitar Kotlins KClass.objectInstance .
Guardo esto como referencia, pero use la solución anterior.
fun foo(cls: Class<*>) { val objectInstance = cls.declaredFields.firstOrNull { it.type == cls && it.name == "INSTANCE" } if (objectInstance != null) println("KotlinObject") else println("Other class") }Tenga en cuenta que cualquier Java Singleton que use el nombre 'INSTANCIA' para el campo singleton también se informará como objeto Kotlin en ese caso.
¡Entiendo!
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) }Producción:
It's a Kotlin object It's NOT a Kotlin objectSi, por alguna razón, debe pasar la clase Java, entonces no pude encontrar ninguna forma de hacerlo. Creo que toda la distinción se ha ido.
NOTA: Esto funciona incluso si JavaClass está definido en un archivo Java. Cada objeto en Kotlin es del tipo KClass independientemente de cómo y dónde se definió. Es decir, ::class funciona en cualquier objeto en Kotlin.