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)
}</