обработка аннотации kotlin: проверьте, принадлежит ли данный TypeElement класс kotlin

Я реализую библиотеку обработки аннотаций, которая генерирует код с использованием поэта Java на основе классов, которые имеют определенные аннотации.

Чтобы также использовать классы, написанные на kotlin, я переключился на kapt вместо apt в моем примере проекта. Он отлично работает с аннотированными java-классами. Bun kotlin-классы имеют другой подход к доступу к полям класса: следует использовать геттеры и сеттеры.

Есть ли способ определить, является ли данный класс (точнее - не классом, а TypeElement - поскольку это происходит до компиляции) java-классом или написан на kotlin? На основе этого я могу написать код, который генерирует доступ к полям или доступ с использованием геттеров.


person Den Drobiazko    schedule 18.12.2017    source источник
comment
Голос против без предложения редактирования, без комментариев ... ничего. Как это должно быть полезно?   -  person Den Drobiazko    schedule 19.12.2017


Ответы (1)


Теоретически любой класс, скомпилированный из kotlin, будет аннотирован kotlin.Metadata. Вы можете использовать метод getAnnotation на TypeElement, чтобы проверить, присутствует ли эта аннотация, чтобы проверить, были ли они написаны на котлине.

val metaDataClass = Class.forName("kotlin.Metadata").asSubclass(Annotation::class.java)
val isKotlinClass = <TypeElement>.getAnnotation(metaDataClass) != null

Версия, которая работает без стандартной библиотеки kotlin в среде обработки:

elementUtils.getAllAnnotationMirrors(typeElement).any { 
    elementUtils.getBinaryName(it.annotationType).contentEquals("kotlin.Metadata") 
}
person Kiskae    schedule 18.12.2017
comment
Компилятор говорит, что мы не можем указать этот класс для получения аннотации: он имеет внутреннюю видимость - person Den Drobiazko; 19.12.2017
comment
Вам нужно будет либо использовать отражение, либо написать чек на Java, поскольку internal становится public при работе с Java-взаимодействием. - person Kiskae; 19.12.2017
comment
ИЛИ ... Мне удалось разрешить isKotlinClass проверку с помощью этого метода: isKotlinClass = elementUtils.getAllAnnotationMirrors(typeElement).any { (it.annotationType.asElement() as TypeElement).qualifiedName.toString() == "kotlin.Metadata" } - person Den Drobiazko; 19.12.2017
comment
кстати, приведенный выше пример (однажды переписанный на Java) позволяет определить isKotlinClass без добавления зависимости kotlin, что удобно. - person Den Drobiazko; 25.12.2017
comment
Добавлена ​​версия с использованием Elements для извлечения имени аннотации. - person Kiskae; 25.12.2017