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<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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容