定义注解
//和一般的声明很类似,只是在class前面加上了annotation修饰符
@Target(AnnotationTarget.ClASS)
@Retation(AnotationRention.SOURCE)
annotation class ApiDoc(val value:String)
注解使用
@ApiDoc("修饰类")
class Box{
//@ApiDoc("修饰字段")
val size = 6
//@ApiDoc("修饰方法")
fun test(){
}
}
Kotlin的元注解
- @Target:定义注解能够应用于哪些目标对象 (CLASS,FUNCTION,PROPERTY...)
- @Rentention:注解的保留期(SOURCE,BINARY,RUNTIME)
- @Repeatable:标记的注解可以多次应用于相同的声明或类型
- @MustBeDocumented:修饰的注解奖被文档工具提取到Api文档中
注解的使用场景
- 提供给编译器,编译器可以利用注解处理一些警告信息,错误等
- 编译阶段时处理:利用注解信息来生成一些代码,在Kotlin深层代码非常常见,一些内置的注解为了与java api的互操作性,往往借助注解在编译阶段生成一些额外的代码
- 运行时处理:某些注解可以在程序运行时,通过反射机制获取注解信息来处理一些程序逻辑
注解实践小案例
fun main(args:Array<String>){
fire(ApiGetArticles())
}
/**
* Kotlin注解实战案例:
* 自定义注解实现API调用时的请求方法检查
*/
enum class Method{
GET,
POST
}
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class HttpMethod(val method:Method)
interface Api{
val name:String
val version:String
get() = "1.0"
}
@HttpMethod(Method.GET)
class ApiGetArticles:Api{
override val name: String
get() = "/api.articles"
}
fun fire(api:Api){
val annotations = api.javaClass.annotations
//api.javaClass.getField("set").annotations 获取属性的注解是这样么?
val method = annotations.find { it is HttpMethod } as? HttpMethod;
print("通过注解得知该接口需要通过 ${method?.method}方式请求")
}
//参考文章 https://blog.csdn.net/zx_android/article/details/106236304