Kotlin学习手记——反射,移动安全入门

这篇博客介绍了Kotlin中如何利用反射获取泛型实参,包括接口方法的返回类型泛型参数和接口类的泛型。同时,通过实例展示了如何实现数据类的深拷贝以及对象间的映射转换。此外,还讨论了在Android中处理可释放对象引用的不可空类型问题。
摘要由CSDN通过智能技术生成

objectInstance获取object单例的实例,如果不是单例类则返回可能为null

B::class.objectInstance?.hello() //获取object实例

A::class.objectInstance?.foo() //如果类不是一个object, 则返回null

类内部的其他类如何获取外部类的实例对象:

class A {

fun String.hello(){

this 表示当前String对象

this@A 表示外部当前的class A对象

}

}

java也是一样,内部类获取外部类的实例时需要通过,A.this 获取

获取泛型实参:

1.获取接口某个方法的返回值类型的泛型参数

interface Api {

fun getUsers(): List

}

获取上面 Api 接口的 getUsers() 返回类型的泛型参数类 UserDTO

有几种方式,第一种是根据name来比较判断找到对应的方法:

//获取到 Api的getUsers() 方法 通过 filter

val functions = Api::class.declaredFunctions.filter { it.name == “getUsers” }

val getUsers : KFunction<*> = functions.get(0)

getUsers.returnType.arguments.forEach {

println(“getUser的返回值泛型:${it}”)

}

//获取函数的返回值参数的泛型类型UserDTO 通过 first

Api::class.declaredFunctions.first { it.name == “getUsers” }

.returnType.arguments.forEach {

println(“getUser的返回值泛型:${it}”)

}

还可以直接通过函数引用获取 Api::getUsers 得到的就是一个KFunction

Api::getUsers.returnType.arguments.forEach {

println(“getUser的返回值泛型2:${it}”)

}

显然这种方式最简单了。

还可以通过java的反射方式来获取:

//Api::class.java是获取到对应java的class Class 然后可以调用java的反射方法获取泛型类型

Api::class.java.getDeclaredMethod(“getUsers”)

.genericReturnType.safeAs()?.actualTypeArguments?.forEach {

println(it)

}

//safeAs是定义的一个Any的扩展方法

fun Any.safeAs(): T? {

return this as? T

}

//safeAs扩展方法可以简写下面的代码,等价于上面的代码

(Api::class.java.getDeclaredMethod(“getUsers”)

.genericReturnType as ParameterizedType).actualTypeArguments?.forEach {

println(it)

}</

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值