文章目录
定义
-
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) { } }
-
如果需要将一个类作为注解的属性,要使用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