最基本的反射特性就是得到运行时的类引用。要获取引用并使之成为静态类可以使用字面类语法:
引用是一种 类型的值。你可以使用 和 KClass.extensionProperties
获取类和父类的所有属性引用的列表。
注意这与 java 类的引用是不一样的。参看 java interop section
函数引用
当有一个像下面这样的函数声明时:
fun isOdd(x: Int) =x % 2 !=0
val numbers = listOf(1, 2, 3)
println(numbers.filter( ::isOdd) ) //prints [1, 3]
这里 ::isOdd
是是一个函数类型的值 (Int) -> Boolean
注意现在 ::
操作符右边不能用语重载函数。将来,我们计划提供一个语法明确参数类型这样就可以使用明确的重载函数了。
如果需要使用一系列类,或者扩展函数,必须是需合格的,并且结果是扩展函数类型,比如。String::toCharArray
就带来一个 String: String.() -> CharArray
类型的扩展函数。
考虑一下下面的函数:
它返回一个由俩个传递进去的函数的组合。现在你可以把它用在可调用的引用上了:
fun length(s: String) = s.size
val oddLength = compose(::isOdd, ::length)
属性引用
var x = 1
fun main(args: Array<String>) {
println(::x.get())
::x.set(2)
println(x)
}
::x
表达式评估为 KProperty<Int>
类型的属性,它允许我们使用 get()
读它的值或者使用名字取回它的属性。更多请参看
对于可变的属性比如 var y =1
,::y
返回类型为 [KMutableProperty<Int>](http://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect/-k-mutable-property.html)
,它有 set()
方法
访问一个类的属性成员,我们这样修饰:
对于扩展属性:
val String.lastChar: Char
println(String::lastChar.get("abc")) // prints "c"
}
在 java 平台上,标准库包括反射类的扩展,提供了到 java 反射对象的映射(参看 kotlin.reflect.jvm 包)。比如,想找到一个备用字段或者 java getter 方法,你可以这样写:
import kotlin.reflect.jvm.*
class A(val p: Int)
fun main(args: Array<String>) {
println(A::p.javaGetter) // prints "public final int A.getP()"
println(A::p.javaField) // prints "private final int A.p"
}
构造函数引用
我们可以像下面这样使用:
function(:: Foo)