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。