Kotlin注解

定義注解

//和一般的聲明很類似,只是在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
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。