Kotlin学习笔记 第四章注解

参考链接

Kotlin官方文档

https://kotlinlang.org/docs/home.html

中文网站

https://www.kotlincn.net/docs/reference/properties.html

本系列为参考Kotlin中文文档

https://download.csdn.net/download/u011109881/21418027

整理的笔记 

pdf也可以在这里下载

https://www.kotlincn.net/docs/kotlin-docs.pdf

大部分示例来自bilibili Kotlin语言深入解析 张龙老师的视频

1 注解的定义与使用

笔记

// 注解的定义与使用

// 元注解 mata-annotation 用于描述注解
// 常见元注解
// 1 元注解 @Target 表示当前annotation使用在哪个位置
// 可以用在类 方法 值参数 表达式 构造方法上
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION,
        AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER)
// 2 元注解 @Retention 表示当前注解是运行时注解还是编译时注解等
// 注解在源码时  运行时  二进制(编译时)
@Retention(AnnotationRetention.SOURCE)
// 3 元注解 @Repeatable 表示当前注解是否可以在同一个元素重复使用
// 4 元注解 @MustBeDocumented 表示当前注解是API 文档的一部分
@MustBeDocumented
// annotation的定义
annotation class MyAnnotation

@MyAnnotation
class D0507Annotation {
    @MyAnnotation
    fun myMethod(@MyAnnotation a: Int/*值参数*/): Int {
        return (@MyAnnotation 10)/*表达式*/
    }
}

// 给主构造方法添加注解 constructor关键字不可省略
class MyClass2 @MyAnnotation constructor(a: Int) {

}

class MyClass3 {
    var a: Int? = null
        // 给set方法添加注解
        @MyAnnotation set
}

2 带构造方法的注解

1 注解也可以拥有自己的构造方法

2 注解中带有class作为参数的注解

3 注解使用处目标 

笔记

import kotlin.reflect.KClass

/**
 * Created by Cai Huijian on 2021/9/16.
 */
// 注解part2
// Java注解与Kotlin注解 100% 兼容

/**
 * 1 注解也可以拥有自己的构造方法
 * 注解的构造方法的参数类型可以是:
 * Java里面定义的基本数据类型(Int,Long...)
 * 字符串类型
 * classes (MyClass::class)
 * 枚举
 * 其他注解
 * 上述类型的数组类型
 *
 * Kotlin 注解不允许为空 因为JVM不支持以null的形式存储注解属性
 * 如果某个注解是另外一个注解的参数 这个注解使用的时候不需要以@开头
 */
// 声明一个参数构造方法的注解
@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION,
        AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER)
annotation class MyAnnotation2(val string: String)

// 使用该注解
@MyAnnotation2("one parameter annotation")
class MyClass4

// 声明2个参数构造方法的注解
annotation class MyAnnotation3(val str: String, val annotation: MyAnnotation2)

// 使用该注解
@MyAnnotation3("2 parameter annotation", MyAnnotation2("parameter"))

/**
 * 2 注解中带有class作为参数的注解
 *
 * 如果某个注解中包含class作为参数 那么需要使用Kotlin class(KClass)
 * Kotlin编译器会将其自动转换为Java class
 * 这样 Java代码才能正常看到注解和参数
 */
annotation class MyAnnotation4(val arg1: KClass<String>, val arg2: KClass<out Any>, val arg3: KClass<*>)

@MyAnnotation4(String::class, Int::class, Float::class)
class MyClass6


/**
 * 3 注解使用处目标 (use-site target)
 *
 * 指明注解是用在何处
 * 在对类的属性或是主构造方法的参数声明注解时 会存在多个Java元素可以通过对应的Kotlin元素生成出来,
 * 因此 在生成的Java字节码中 可能存在多个可能的位置用于生成注解 (即注解存在二义性或多义性 不知道这个注解是加在什么东西上的)
 * 如想确定注解是加到什么东西上 可以使用注解使用出目标对注解进行进一步修饰
 */

@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION,
        AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FIELD, AnnotationTarget.PROPERTY_GETTER)
annotation class MyCustomerAnnotation

// 不加 注解使用处目标 可能不知道该注解用在何处 比如用在属性上 get方法上还是构造方法的形参上 加上注解使用处目标可以清晰知道该注解用在何处
class MyClass7(@field:MyCustomerAnnotation val arg1: String,// 用在Java 属性值上
               @get:MyCustomerAnnotation val arg2: String,// 用在该属性的get方法
               @param:MyCustomerAnnotation val arg3: String)// 用在构造方法的参数上


fun main() {

}

class D0507Annotation2 {
}

4 注解使用处目标 @file

// 元注解 @file
// 使用该注解不会生成D0507Annotation3Kt.class 而是生成CustomerName.class
@file:JvmName("CustomerName")

package com.example.lib.d05others

class D0507Annotation3 {
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值