Kotlin Reflection: Как узнать, помечен ли класс Kotlin "внутренним" модификатором видимости

Я автоматически генерирую код с помощью KotlinPoet и Auto Service. Я не нашел способа узнать, есть ли у аннотированного класса модификатор "internal", поэтому я могу создать другой класс с таким же модификатором. Например:

@MyAnnotation
internal class Car

Поэтому я подумал, что с помощью Kotlin Reflection я смогу получить эту информацию, но не повезло.

С процессором аннотатора я могу получить KClass, но видимость сказала "public":

Любые подсказки о том, как это сделать?

3 ответа

Решение

Отражение Котлина не применяется при обработке аннотаций. Отражение Kotlin предназначено для проверки вашего кода во время выполнения. Однако есть способ выделить метаданные из файлов классов Kotlin, он называется kotlinx-metadata-jvm.

Чтобы использовать это в своем процессоре аннотаций, вам необходимо получить AnnotationMirror из kotlin.Metadata аннотаций. Из этого зеркала получите значения аннотаций и используйте их для построения KotlinClassHeader как вы можете видеть в примерах для kotlinx-metadata-jvm. Когда вы окажетесь там, вы можете использовать kotlinx-metadata-jvm, чтобы извлечь флаги для вашего класса.

Котлин-х KClass имеет visibility свойство, которое может быть KVisibility.INTERNAL,

Поскольку internal является модификатором видимости, вы должны искать что-то, связанное с KClass API. Следующее поможет вам:

 /**
 * Visibility of this class, or `null` if its visibility cannot be represented in Kotlin.
 */
@SinceKotlin("1.1")
public val visibility: KVisibility?

Используется так: Car::class.visibility //INTERNAL

Другие вопросы по тегам