
Аннотации в Kotlin: от @Deprecated до своего KSP-процессора
timkaopensoul 17 минут назад Аннотации в Kotlin: от @Deprecated до своего KSP-процессора Средний 15 мин 708 Блог компании Uzum Kotlin * Android * Компиляторы * Разработка мобильных приложений * Аннотации легко...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: timkaopensoul 17 минут назад Аннотации в Kotlin: от @Deprecated до своего KSP-процессора Средний 15 мин 708 Блог компании Uzum Kotlin * Android * Компиляторы * Разработка мобильных приложений * Аннотации легко воспринимать как декоративную часть языка. Поставили @Deprecated, добавили @Suppress, пометили DTO через @JsonClass - и пошли дальше. Но в большом Android-проекте аннотации быстро перестают быть просто подсказками для IDE.
Они становятся контрактом между кодом и инструментами: компилятором, статическим анализатором, генератором кода, DI-фреймворком, сериализатором или внутренней платформенной инфраструктурой. В этой статье разберем, что на самом деле происходит вокруг аннотаций в Kotlin, чем отличаются SOURCE, BINARY и RUNTIME, почему @Composable - это не просто красивая метка, чем kapt отличается от KSP, и на каких практических задачах annotation processing может быть полезен в Android-разработке. Аннотация - это метаданные для кодаСамый простой пример:@Deprecated("Use deliveryType instead val isManualPickup: Boolean На первый взгляд это просто сообщение для разработчика.
Технические детали
Но уже здесь есть несколько важных деталей:аннотация добавляет к элементу кода метаданные;эти метаданные может прочитать не только человек, но и инструмент;инструмент может принять решение: подсветить warning, сгенерировать код, запретить использование, изменить поведение сборки. Аннотации встречаются почти везде:@JsonClass(generateAdapter = true) data class CreateChatRequest( @Json(name = "chat val params: CreateChatParams, ) @Volatile private var constructorRef: Constructor? = null @POST("user/reviews/ suspend fun postFeedback( @Body request: PostFeedbackRequest, ): PostFeedbackResponse @Suppress("CyclomaticComplexMethod override fun checkResponse(response: Response): ProjectException?
Каждая из них решает свою задачу. @JsonClass включает генерацию адаптера, Retrofit-аннотации описывают HTTP-контракт, @Suppress влияет на статический анализ, @Volatile меняет семантику доступа к полю на JVM. То есть аннотация сама по себе почти ничего не делает.
Смысл появляется там, где есть инструмент, который умеет ее прочитать.! n( тоже аннотируютсяУ аннотаций есть собственные аннотации. Например, @Deprecated в Kotlin объявлен примерно так:@Target( AnnotationTarget.
Отраслевые последствия
CLASS, AnnotationTarget. FUNCTION, AnnotationTarget. PROPERTY, AnnotationTarget.
CONSTRUCTOR, AnnotationTarget. TYPEALIAS, ) @MustBeDocumented public annotation class Deprecated( val message: String, val replaceWith: ReplaceWith = ReplaceWith(" val level: DeprecationLevel = DeprecationLevel. WARNING, ) @Target определяет, к каким элементам можно применить аннотацию: к классу, функции, свойству, параметру, другой аннотации и так далее.
@MustBeDocumented говорит инструментам документации, что эту аннотацию стоит показывать в сгенерированной документации.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.



