Kotlin学习笔记之 26 反射

255 阅读1分钟

首发于公众号: DSGtalk1989

26.反射

  • 函数引用

    我们用::加上函数名的方式表示函数的引用。

    我们有这样一个需求,结合我们上面说过的高阶函数,高阶函数通常和面需要传入的是一个函数。就比如List类的filter这个高级函数。

      public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
          return filterTo(ArrayList<T>(), predicate)
      }
    

    可以看到,需要传入一个(T) -> Boolean的函数,那么比如我们自己有定义过这样一个函数。

    fun isOdd(x: Int) = x % 2 != 0
    

    传入的是Int类型,得到的是推断出来的Boolean类型,符合上面说的(T) -> Boolean类型,这个时候我们如何把这个isOdd方法传入给高阶函数呢,就要使用到函数的引用。

    val numbers = listOf(1, 2, 3)
    println(numbers.filter(::isOdd))
    
  • ::引用对应的对象

    类引用对应的是MyClass::class -> KClass

    方法引用对应的是::myFun -> KFunction<out R>

    val属性引用对应的是::valproperty -> KProperty,可以调用get()方法,可以获得name属性。

    var属性引用对应的是::varProperty -> KMutableProperty,除了get()方法和name属性之外还可以调用set()方法

    针对类中的属性引用,使用的是MyClass::property