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