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<String>) {
println(::x.get()) // prints "1"
::x.set(2)
println(x) // prints "2"
}
类属性引用
class A(val p: Int)
fun main(args: Array<String>) {
println(A::p.get(A(1))) // prints "1"
}
构造函数引用
class Foo
fun function(factory : () -> Foo) {
val x : Foo = factory()
}
function(::Foo)