Kotlin注解入门


Kotlin使用annotation class关键字来定义注解。

一、定义注解

Kotlin不允许为注解定义注解体。

//定义一个简单的注解
annotation class Test

定义了注解之后,可以在程序的任何地方使用注解。

在默认情况下,注解可用于修饰任何程序元素,包括类、接口、属性、方法等。

//注解修饰类
@Test
class MyTestClass {
    //注解修饰属性
    @Test
    var name: String = ""

    //注解修饰方法
    @Test
    fun info() {

    }
}

如果用注解修饰主构造器,必须为主构造器添加constructor关键字。

class UserTest @Test constructor(var name:String){}

二、注解的属性和构造器

注解还可以带属性,由于注解没有注解体,因此注解的属性只能在注解声明部分指定。

带属性和构造器的注解:

annotation class MyTag(val name: String, val age: Int)

注解的属性不可使用可空类型,因为JVM不允许使用null作为注解的属性值。

注解的属性可支持如下类型:

  • 对应于java基本类型的类
  • 字符串
  • 枚举
  • 其他注解
  • 上面各种类型的数组

一旦在注解中定义了属性之后,使用该属性时就应该为其指定属性值。

annotation class MyTag(val name: String, val age: Int)

class MyItem{
    //使用带属性的注解时,需要为属性指定属性值
    @MyTag(name = "Kotlin", age = 4)
    fun info() {

    }
}

根据注解是否可以包含属性,可以把注解分为两类:

  • 标记注解:没有定义属性的注解被称为标记注解。这种注解仅利用自身存在与否来提供信息。
  • 元数据注解:包含属性的额注解被称为元数据注解。

如果注解的属性名为value,为value属性指定属性值时可省略属性名。

//定义带value属性的注解
annotation class MyTag(val value:String)

class MyItem{
    //为value属性指定属性值时无须带属性名
    @MyTag("asda")
    fun info(){}
}

Kotlin使用vararg修饰需要指定多个值得属性(相当于数组类型的属性)。

annotation class MyTag(vararg val infos:String)

class MyItem{
    @MyTag("Java","C/C++","Kotlin")
    fun info(){}
}

对于使用vararg修饰的属性,不管它的属性名是什么,系统为该属性指定属性值时,都不需要指定属性名,直接在注解中指定多个属性值即可。

如果将一个注解作为另一个注解的属性值,那么在使用注解时不需要以@作为前缀。

//定义带value属性的注解
annotation class MyTag(val infos:String)

//该注解的target属性的类型是MyTag
annotation class ShowTag(val message:String,val target:MyTag)

@ShowTag("message属性值",target = MyTag("Kotlin"))
class Circle

如果需要将一个类作为注解的属性,请使用Kotlin类(KClass),Kotlin编译器会自动将其转换为Java类,以便Java代码能够正常看到该注解和参数。

annotation class DrawTag(val arg1: KClass<*>, val arg2: KClass<out Any>)

@DrawTag(arg1 = String::class, arg2 = Int::class)
class Circle

学海无涯苦作舟

我的微信公众号.jpg


文章作者: HunterArley
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HunterArley !
评论
  目录