Я хочу определить, является ли класс JVM классом Котлина или нет

Я хочу сделать специальную функциональность, если я столкнулся с классом Kotlin по сравнению с общим классом Java. Как я могу определить, является ли это классом Kotlin?

Я надеялся, что вызов someClass.kotlin вызовет исключение или сбой, если класс не был Kotlin. Но он отлично переносит классы Java. Затем я заметил, что если я делаю someClass.kotlin.primaryConstructor, это, кажется, null для всех классов java, даже если у них есть конструктор по умолчанию, является ли это хорошим маркером? Но может ли это вернуть null для класса Котлина?

Каков наилучший способ сказать: "Это класс Котлина?"

Ответ 1

Kotlin добавляет аннотацию ко всем своим классам, и вы можете спокойно проверить его существование по имени. Это детализация реализации и может меняться со временем, но некоторые ключевые библиотеки используют эту аннотацию, поэтому она, вероятно, будет оставаться неопределенной.

fun Class<*>.isKotlinClass(): Boolean {
    return this.declaredAnnotations.any {
        it.annotationClass.qualifiedName == "kotlin.Metadata"
    }
}

Может использоваться как:

someClass.isKotlinClass()

Класс kotlin.Metadata недоступен напрямую, поскольку он отмечен как internal в среде выполнения Kotlin.