反射,簡單來說,是一種在運行時動態地訪問對象屬性和方法的方式,而不需要事先確定這些屬性是什么。
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