本文介绍 Kotlin
反射的用法。
在 Java
中也有反射的相关用法,不过因为运行时反射效率差,而且 java
中的反射使用起来相对麻烦,在实际开发中反射的使用还是很少的。不过在 Kotlin
中的反射使用起来十分简单。
反射,我们平常访问对象的属性和函数,是针对对象来说的,总是访问他们的 “值”,比如一个属性的具体值,或者执行某个函数,都是使用对象来调用,这都是访问 “值” 的操作,而反射,是针对类来说的,也就是不必有类实体,而是访问类的属性和函数本身,不再在乎值到底是什么,而是真正的把这个属性或函数拿出来,当我们想要这个属性的值或函数的执行结果,我们就需要用拿到的属性和函数本身去调用一个对象,这个过程就反过来了,不是对象调用属性和函数,而是属性和函数本身调用对象。
在 Kotlin
中使用反射需要借助 ::
操作符。
Class Reference
获取某个类的引用
1 | // 获取 kotlin class |
从 KClass
类型的变量中可以获取类的的属性
1 | kClass.constructors |
Function Reference
反射获取函数引用,非类成员函数时可以直接使用 ::funcName
的形式获取函数,
1 | // top level 级别函数 |
对于类成员函数反射返回的结果其实是 类名.(参数)->返回值
类型的函数,因此上面是编译错误的。
1 | val f4: ReflectFunTest.(String) -> Int = ReflectFunTest::funcInClass |
执行函数,对于非类成员函数可以直接执行,而对于类成员函数则需要依赖类的实例来执行。
1 | val f1: (String) -> Int = ::funcInTopLevel |
Property Reference
反射获取属性引用,支持类属性和扩展属性。
1 | // 扩展属性 |
Constructor Reference
反射获取构造器引用
1 | class ReflectConstructorTest() { |