大家好,我是青空。今天给大家带来的是kotlin 反射。

文末可领取大厂面试题
获取静态已知Kotlin类的引用
使用::class
val?c?=?MyClass::class
若要获得 Java 类引用
需在 KClass 实例上使用 .java 属性
val?c?=?MyClass::class
c.java
通过已有的对象获取类的引用
也是用::class获取
?val?widget:?Widget?=?……
assert(widget?is?GoodWidget)?{?"Bad?widget:?${widget::class.qualifiedName}"?}
获取函数引用
使用 :: 操作符
范例
fun?isOdd(x:?Int)?=?x?%?2?!=?0
fun?main()?{
????val?numbers?=?listOf(1,?2,?3)
????isOdd(4)?//这是函数调用
????println(numbers.filter(::isOdd))?//这里的::isOdd是函数引用
}
::isOdd 是函数类型为 (Int) -> Boolean 的一个值
::可用于重载函数
fun?main()?{
????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))?//?引用到?isOdd(x:?Int)
????println(isOdd("dd"))?//?引用到?isOdd(x:?Int)
}
倒数两行,可以自动进行重载
获取到的函数引用
获取属性引用
也是使用 ::
范例
val?x?=?1
fun?main()?{
????println(::x.get())
????println(::x.name)?
}
若函数不需要参数
可以这样用
fun?main()?{
????val?strs?=?listOf("a",?"bc",?"def")
????println(strs.map(String::length))
}
获取类的成员属性
fun?main()?{
????class?A(val?p:?Int)
????val?prop?=?A::p
????println(prop.get(A(1)))
}
支持扩展属性
val?String.lastChar:?Char
????get()?=?this[length?-?1]
fun?main()?{
????println(String::lastChar.get("abc"))
}
kotlin转换为java的反射引用
需要用到kotlin.reflect.jvm 包 范例
要查找一个用作 Kotlin 属性 getter 的 幕后字段或 Java方法
import?kotlin.reflect.jvm.*
class?A(val?p:?Int)
fun?main()?{
????println(A::p.javaGetter)?//?输出?"public?final?int?A.getP()"
????println(A::p.javaField)??//?输出?"private?final?int?A.p"
}
java转kotlin的反射引用
fun?getKClass(o:?Any):?KClass<Any>?=?o.javaClass.kotlin
引用构造函数
通过使用 :: 操作符并添加类名来引用
范例
?class?Foo
fun?function(factory:?()?->?Foo)?{
????val?x:?Foo?=?factory()
????println("111"?+?x)
}
fun?main()?{
????function(::Foo)
}
-
这里有个class和一个function -
() -> Foo是零参的lambda写法 -
向function传入这个Foo的实例 -
使用::Foo可以直接引用构造函数 -
factory获取引用后,?(),进行实例化 -
输出:111Foo@63961c42
保存 函数与属性的引用
范例
fun?main()?{
????val?numberRegex?=?"\\d+".toRegex()
????println(numberRegex.matches("29"))
????val?isNumber?=?numberRegex::matches
????println(isNumber("29"))
}
这是js中的一个写法,fun也可以当变量一样随意保存
保存 类的内部类
inner 类的构造函数 ?可以被保存起来
class?Outer?{
????inner?class?Inner
}
val?o?=?Outer()
val?boundInnerCtor?=?o::Inner
最近又赶上跳槽的高峰期,好多粉丝,都问我有没有最新大厂面试题,我连日加班好多天,终于整理好了,1000+ 道,20多份大厂面试题大全,我会持续更新中!公众号回复【面试题】即可获取。

|