kotlin: проверить, является ли класс объектом класса? - PullRequest
1 голос
/ 28 марта 2019

У меня есть объект kotlin и класс java, например:

KotlinObject.kt

object KotlinObject{
....
}

JavaClass.java

class JavaClass {
...
}

и функция котлина для проверки:

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 ]

3 голосов
/ 28 марта 2019

Спасибо @Alexey Romanov за указание в комментариях, что информация о классе Kotlin доступна из Class<*>.

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

Мой оригинальный подход состоял в том, чтобы подражать Котлинсу 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")
}

Имейте в виду, что любой Java-синглтон, использующий имя 'INSTANCE' для синглтонного поля, также будет сообщаться как объект Kotlin в этом случае.

2 голосов
/ 28 марта 2019

Понял!

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, то я не мог придумать, как это сделать. Я думаю, что все различия исчезли.

ПРИМЕЧАНИЕ. Это работает, даже если JavaClass определен в файле Java. Каждый объект в Kotlin имеет тип KClass независимо от того, как и где он был определен. То есть :: class работает с любым объектом в Kotlin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...