
上QQ阅读APP看书,第一时间看更新
7.3.4 属性引用,获取类的成员变量
1.Java获取类的成员变量
Java获取类的成员变量对应的是java.lang.reflect.Field,有以下4种方式:
//获取相应的类自身声明的public 成员变量(包括从基类继承的、从接口实现的) public Field getField(String name) //获取类自身声明全部的public 成员变量(包括从基类继承的、从接口实现的) public Field[] getFields() //获取相应的类自身声明的成员变量,包含 public、protected和private成员变量 public Field getDeclaredField(String name) //获取类自身声明的成员变量,包含 public、protected和private public Field[] getDeclaredFields()
2.Kotlin获取类的属性
Kotlin没有成员变量的概念,只有属性的概念。下面展示引用不同属性的方式。
(1)不可变属性的引用
Kotlin使用::属性来获取不可变属性的引用,并返回KProperty<V>类型的值。它的get()方法会返回属性的值,它的name属性会返回可变属性的名称。

执行结果如下:
val x: kotlin.Int 1 x val y: kotlin.String hello y
(2)可变属性的引用
Kotlin使用::属性来获取可变属性的引用,并返回KMutableProperty<V>类型的值。它除了上述的get()方法、name属性外,还支持set()方法修改属性的值。

执行结果如下:
var x: kotlin.Int 0 x var y: kotlin.String world y
(3)扩展属性的引用
Kotlin使用类名::属性来获取扩展属性的引用,并返回KProperty1<T, out V>类型的值。它的get()、getValue()方法会返回扩展属性的值。

(4)类的成员属性的引用
Kotlin使用类名::属性来获取成员属性的引用,并返回KProperty1<T, out V>类型的值。它的get()、call()方法会返回成员属性的值。

执行结果如下:
1 1 1 2 test 2
另外,这里的call()方法依然是KCallable接口的call()方法。call()方法的调用最终会调用该属性的getter属性。
毕竟,KProperty、KFunction的超类型都是KCallable。