反射
Kotlin中属性和函数与对象一样都是一等公民,可以直接通过反射获取其引用;
1.1、类引用
Kotlin中的类引用用KClass表示,引用的是KClass对象,Java的类引用是java.lang.Class对象,二者不一样;
对于已知的Kotlin类,通过以下获取其类引用:
var c=MyClass(类名)::classs
如果已有Kotlin对象,也可使用对象获取类引用:
var c=clz::class
如果要通过KClass获取对应的Java类引用:调用KClass对象的java属性
c.java;
1.2、反射创建实例
方式一:
- 获取到KClass对象后,可以调用其createInstance()方法创建该类的实例,该方法***总是调用该列无参构造器创建的实例***,因此使用该方法的前提就是必须提供无参构造器;
方式二:
通过获取到的KClass对象的,借助其constructors获取到所有构造器,再利用条件判断返回目标构造器,最后通过目标构造器对象的call()创建出对应的实例;
class Item(var name:String){
var price=0.0
constructor(name: String,price:Double):this(name){
this.price=price
}
constructor():this("未知商品"){
}
}
fun main(args: Array<String>) {
val itemClz= Item::class;
val instance = itemClz.createInstance()
println("createInstance()调用无参构造器创建实例")
println(instance.name)
println(instance.price)
println("调用有参构造器创建实例")
itemClz.constructors.forEach {
if(it.parameters.size==2){
val item = it.call("酸奶&#