Аннотации в Kotlin используются для прикрепления метаданных к классам, интерфейсам, параметрам и т. д. во время компиляции. Аннотации могут использоваться компилятором, который отражается во время выполнения. Мы можем изменить значение данных или программы в соответствии со значениями аннотаций.
Мета-аннотации Kotlin
Мы можем добавить метаинформацию при объявлении аннотации в Котлин. Ниже приведены некоторые мета-аннотации:
| Имя аннотации | Применение |
|---|---|
| @Target | Предназначена для всех возможных типов элементов, которые могут быть аннотированы аннотацией. |
| @Retention | Указывает, хранится ли аннотация в скомпилированных файлах классов или она видна через отражение во время выполнения. |
| @Repeatable | Эта мета-аннотация определяет, что аннотация применима дважды или более к одному элементу кода. |
| @MustBeDocumented | Этот метадокумент указывает, что аннотация является частью общедоступного API и должна быть включена в класс или метод. |
Пример использования
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION) @Retention(AnnotationRetention.SOURCE) @MustBeDocumented annotation class MyClass
Объявление аннотации
Аннотация объявляется путем размещения модификатора аннотации перед классом.
annotation class MyClass
Аннотация к конструктору
Также возможно аннотировать конструктор класса. Это делается путем добавления ключевого слова конструктора для объявления конструктора и размещения аннотации перед ним.
class MyClass@Inject constructor( dependency: MyDependency){
//. . .
}
Аннотировать оценщиков имущества
class MyClass{
var a: MyDependency? = null
@Inject set
}
Использование конструктора в качестве аннотации
Мы также можем использовать конструктор в качестве аннотации.
annotation class MyClass(val why: String)
@MyClass("parameter") class Foo{
}
Параметры, которые используются в качестве аннотации, не могут быть типами, допускающими значение NULL. Это связано с тем, что JVM не поддерживает null в качестве значения атрибута аннотации.
Мы также можем использовать одну аннотацию в качестве параметра для другой аннотации, в такой ситуации она не может принимать префиксный символ @. Например:
annotation class ReplaceWith(val expression: String)
annotation class Deprecated(
val message: String,
val replaceWith: ReplaceWith = ReplaceWith(""))
@Deprecated("This function is deprecated, use === instead", ReplaceWith("this === other"))
Kotlin также указывает, что класс может принимать аргумент аннотации с помощью KClass. Компилятор Kotlin автоматически преобразует его в класс java, что позволяет нормально видеть аннотации и аргументы.
import kotlin.reflect.KClass annotation class MyClass(val arg1: KClass<*>, val arg2: KClass<out Any>) @MyClass(String::class, Int::class) class Foo
Пример использования аннотации TYPE
Создание интерфейса аннотаций Java Ann.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Ann{
int value();
}
Создайте класс MyClass.kt, который использует интерфейс аннотации Ann.
@Ann(value = 10)
class MyClass{
}
fun main(args: Array<String>){
var c = MyClass()
var x = c.javaClass.getAnnotation(Ann::class.java)
if(x!=null){
println("Value:"+x?.value)
}
}
Выход:
Value: 10
