反射,简单来说,是一种在运行时动态地访问对象属性和方法的方式,而不需要事先确定这些属性是什么。
Kotlin反射API:KClass、KCallable、KFunction、KPropperty
KClass
对应Java中的java.lang.class
//Kotlin获取一个类 val myClass: KClass<Person> = Person::class //Java获取一个类 Class<Person> myClass = Class.forName("com.xx.xx.Person") //Java运行时获取一个对象的类 Person person = new Person() Class<Person> myClass = person.getClass() //Kotlin运行时获取一个对象的类 val person = Person("Alice","20") val myClass = person.javaClass.kotlin >>>println(myClass.simpleName) Person >>>myClass.memberProperties.forEach{ println(it.name) } age name
KCallable(适用于不知道参数类型和数量,通用)
KCallable是属性和函数的超借口。类的所有成员组成的列表是一个KCallable实例的集合。
它声明了call方法,相当于Java中的invoke方法。
fun foo(x: Int) = println(x) >>>val myFun =::foo >>>myFun.call(4) 4
KFunctionN(适用于知道参数类型和数量,有安全性)
val myFun: KFunction2<Int, Int>= ::sum 中,2表示接收2个形参,尖括号里说明了参数的类型。
可以直接调用 myFun(4,6)
KProperty
var counter = 0 >>>val kProperty = ::counter >>>kProperty.setter.call(2) >>>println(kProperty.get()) 2