Я хочу определить, является ли класс 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.