大家好,我是青空。今天给大家带来的是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)
}
倒数两行,可以自动进行重载
获取到的函数引用
-
就相当于一个fun
-
可以通过val myMethod: (String) -> Boolean = ::isOdd
-
进行赋值
获取属性引用
也是使用 ::
范例
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的反射引用
- 使用 .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"))
}
-
numberRegex::matches被保存到了isNumber上
-
这里就相当于是一个fun
这是js中的一个写法,fun也可以当变量一样随意保存
保存 类的内部类
inner 类的构造函数 可以被保存起来
class Outer {
inner class Inner
}
val o = Outer()
val boundInnerCtor = o::Inner
最近又赶上跳槽的高峰期,好多粉丝,都问我有没有最新大厂面试题,我连日加班好多天,终于整理好了,1000+ 道,20多份大厂面试题大全,我会持续更新中!公众号回复【面试题】即可获取。