注解


注解的声明

注解的主要几个

  1. @Target
  2. @Retention
  3. @Repeatable
  4. @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()
}

完结

results matching ""

    No results matching ""