Аннотации в Kotlin и примеры использования

Аннотации в 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 

Оцените статью