注解
注解的声明
注解的主要几个
- @Target
- @Retention
- @Repeatable
- @MustBeDocumented
@Target(AnnotationTarget.CONSTRUCTOR, AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE)
@Repeatable
@MustBeDocumented
annotation class Hello
使用
class Student @Hello constructor(name: String) {
}
构造函数
注解也有构造函数,并且他的参数可以是一般对象,而且注解本身也可以作为参数,但是使用时就像普通类一样,不需要前面添加@
@IAnnotation("niebin")
class Student constructor(name: String) {
}
@Target(AnnotationTarget.CLASS)
annotation class IAnnotation(val name: String)
lambda表达式
注解lambda表达式
fun BaseMain() {
var col = @Hello { println("This is test.") }
col()
}
@Target(AnnotationTarget.EXPRESSION)
annotation class Hello
使用场景Target
这是kotlin 自带的一些关键字注解,就是使用在各种场景如,file,field ,property等。如使用在field 中
@Target(AnnotationTarget.EXPRESSION, AnnotationTarget.FIELD)
annotation class Hello
class Student {
@field:Hello
var name = ""
}
当在同一个地方使用多个注解时,可以用@set,
如果没有指定场景时,就会选择注解能使用适用的场景,如果有多个,优先使用param,property,field.
Java 注解
省略 学习地址
使用java的数组
注意在kotlin 中的三种初始化模式
//java 中定义
public @interface AnValues {
String[] value();
}
//kotlin 中使用 数组变为多参数模式即varag
@AnValues("What", "about", "this", "!")
class Student {
@AnValues(value = ["Black", "Hermonie", "Ron"])
var name = ""
@AnValues(value = arrayOf("12", "11", "13"))
var age: Int = 0
}
读取注解
这里添加了 利用反射对 注解的读取,这只是对注解类 没有写其他情况,如字段、属性,方法的注解。
fun BaseMain() {
var str = findAnn(Student::class)
println("anv2: $str")
}
@AnV2(annValues = arrayOf("1", "2", "sdsdsd"))
@Deprecated("Fuc")
class Student {
var name = ""
}
annotation class AnV2(val annValues: Array<String>)
fun describeAn(anV: AnV2?) {
println(anV?.annValues)
var strB: StringBuilder
}
fun <T : Any> findAnn(c: KClass<T>): String {
var anV = c.annotations.find { it is AnV2 } as? AnV2
var values = anV?.annValues ?: arrayOf()
var strB: StringBuilder = StringBuilder()
for (str in values) {
strB.append(str)
strB.append(",")
}
return strB.toString()
}
完结