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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容