文章目录

定义

  1. Kotlin不允许注解定义注解体

    /**
     * 1. 定义注解,默认情况下,注解可修饰任何程序元素,包括类、接口、属性、方法等
     * 2. annotation class相当于定义了一个注解接口,注解接口继承kotlin.Annotation接口
     * 3. 注解的属性不能使用可空类型,因为JVM本身不允许使用null作为注解的属性值
     * 4. 注解属性值支持
     *    - 对应java基本类型的类
     *    - 字符串
     *    - 类
     *    - 枚举
     *    - 其他注解
     *    - 上面各种类型的数组
     */
    
    //不带属性
    annotation class Person1
    //带属性
    annotation class Person2(val name: String, val age:Int)
    //设置默认值
    annotation class Person3(val name: String, val age:Int = 19)
    // 多个值(数组)使用vararg
    annotation class Person4(vararg val names: String, val age:Int = 19)
    
    //注解属性之是注解,不需要加@
    annotation class City(val person: Person2)
    
    
    
    /**
     * 注解修饰主构造器,必须为主构造器添加constructor
     */
    class User @Person2(name = "jannal", age = 100) constructor(var name: String, var pass: String) {
    
        val username: String = name
        val password: String = pass
    
        @Person2(name = "jannal", age = 100)
        fun run(username: String, password: String) {
        }
    
        @Person4(names = arrayOf("jannal", "jannal2"), age = 100)
        fun run2(username: String, password: String) {
        }
    
        //使用vararg修饰不需要指定属性名
        @Person4("jannal", "jannal2", age = 100)
        fun run3(username: String, password: String) {
        }
    
        @City(person = Person2("username",19))
        fun run4(username: String, password: String) {
        }
    
    }
    
    
  2. 如果需要将一个类作为注解的属性,要使用KClass,kotlin编译器会自动将其转换为java Class,以便java代码能够正常看到该注解和参数

    annotation class Monitor(val arg1: KClass<*>, val arg2: KClass<out Any>)
    
    @Monitor(arg1 = String::class, arg2 = Int::class)
    class RequestController
    
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐