定義注解
//和一般的聲明很類似,只是在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