Kotlin 笔记 反射

Kotlin 中函数和属性是一等公民,可以直接引用它们。

要使用reflection需要手动添加kotlin-reflect.jar

类引用

val c = MyClass::class

kotlin中定义的类的type是KClass,要得到java的class reference,需要调用MyClass::class.java

函数引用

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

val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd)) // prints [1, 3]

如果函数参数类型可以从上下文中得到,那么可以引用overload的函数

fun isOdd(x: Int) = x % 2 != 0
fun isOdd(s: String) = s == "brillig" || s == "slithy" || s == "tove"

val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd)) // refers to isOdd(x: Int)

如果要明确的引用一个overload的函数,则可以将函数赋值给一个变量

val predicate: (String) -> Boolean = ::isOdd   // refers to isOdd(x: String)

引用类的成员函数或者成员属性,或者extension函数,需要加上类名,如String::toCharArray

属性引用

普通属性引用

var x = 1

fun main(args: Array) {
    println(::x.get()) // prints "1"
    ::x.set(2)
    println(x)         // prints "2"
}

类属性引用

class A(val p: Int)

fun main(args: Array) {
    println(A::p.get(A(1))) // prints "1"
}

构造函数引用

class Foo

fun function(factory : () -> Foo) {
    val x : Foo = factory()
}

function(::Foo)

你可能感兴趣的:(Kotlin 笔记 反射)