《Kotlin核心编程》笔记:反射、注解和加锁

本文详细介绍了Kotlin中的KClass、KCallable、KProperty等核心概念,以及它们与Java反射的对比,包括Kotlin特有的Metadata、注解系统,如元注解、RetentionPolicy和精确的注解控制。还探讨了Kotlin中的并发处理机制,如synchronized和withLock方法的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kotlin 和 Java 反射

在这里插入图片描述
在这里插入图片描述

  • 1)Kotlin 的 KClass 和 Java 的 Class 可以看作同一个含义的类型,并且可以通过.java.kotlin方法在KClassClass之间互相转化。
  • 2)Kotlin 的 KCallable 和 Java 的 AccessiableObject 都可以理解为可调用元素。Java 中构造方法为一个独立的类型,而 Kotlin 则统一作为 KFunction 处理。
  • 3)Kotlin 的 KProperty 和 Java 的 Field 不太相同。Kotlin 的KProperty通常指相应的GetterSetter (只有可变属性Setter)整体作为一个KProperty(通常情况 Kotlin 并不存在字段的概念),而 Java 的 Field 通常仅仅指字段本身。

在某些情况下(通常是碰到一些Kotlin独有的特性时)Kotlin编译器会在生产的字节码中存储额外信息,这些信息目前是通过 kotlin.Metadata 解实现的。Kotlin 编译器会用 Metadata 标注这些类。

Kotlin 的 KClass

KClass的特别属性或者函数(在Kotlin中独有,Java没有与之对应的特性):

属性或函数名称 含义
isCompanion 是否伴生对象
isData 是否数据类
isSealed 是否密封类
objectInstance object实例(如果是object
companionObjectInstance 伴生对象实例
declaredMemberExtensionFunctions 扩展函数(声明的)
declaredMemberExtensionProperties 扩展属性(声明的)
memberExtensionFunctions 本类及超类扩展函数
memberExtensionProperties 本类及超类扩展属性
starProjectedType 泛型通配类型

Kotlin 的 KCallable

Kotlin 把 Class 中的属性(Property)、函数(Funciton)甚至构造函数都看作 KCallable,因为它们是可调用的,它们都是Class的成员。那我们如何获取一个Class的成员呢?

KClass给我们提供了一个members方法,它的返回值就是一个Collection<KCallable<*>>

KCallable提供的 API:

API 描述 含义
isAbstract: Boolean KCallable 是否为抽象的
isFinal: Boolean KCallable 是否为 final
isOpen: Boolean KCallable 是否为 open
name: String KCallable 的名称
parameters: List<KParameter> 调用此 KCallable 需要的参数
returnType: KType KCallable 的返回类型
typeParameters: List<KTypeParameter> KCallable 的类型参数
visibility: KVisibility? KCallable 的可见性
call(vararg args: Any?): R 给定参数调用此 KCallable

KMutablePropertyKProperty的一个子类,那我们如何识别一个属性是KMutableProperty还是KProperty呢?参考如下代码:

fun KMutablePropertyShow() {
   
    val p = Person("张三", 8, "HangZhou")
    val props = p::class.memberProperties
    for (prop in props) {
   
        when (prop) {
   
            is KMutableProperty<*> -> prop.setter.call(p, "Hefei")
            else -> prop.call(p)
        }
    }
    println(p.address)
}

获取参数信息

Kotlin 把参数分为3个类别,分别是函数的参数(KParameter)、函数的返回值(KType)及类型参数(KTypeParameter)。

KParameter

使用KCallabel.parameters即可获取一个List<KParameter>,它代表的是函数(包括扩展函数)的参数。

API 描述 含义
index: Int 返回该参数在参数列表里面的索引
isOptional: Boolean 该参数是否为 Optional
isVararg: Boolean 该参数是否为 vararg
kind: Kind 该参数的 Kind
name: String? 该参数的名称
type: KType 该参数的类型
fun KParameterShow() {
   
    // val p = Person("张三", 8, "HangZhou")
    for (c in Person::class.members) {
   
        print("${
     c.name} -> ")
        for (p in c.parameters) {
   
            print("${
     p.type}" + " -- ")
        }
        println()
    }
}

运行结果:


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值