思维导图|kotlin 反射

本文深入探讨了Kotlin的反射机制,包括如何获取类、函数和属性的引用,以及如何进行函数调用和属性访问。通过示例展示了如何使用::操作符,以及在Java和Kotlin之间转换反射引用。此外,还提到了保存函数和属性引用的方法,并提供了大厂面试题。
摘要由CSDN通过智能技术生成

大家好,我是青空。今天给大家带来的是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多份大厂面试题大全,我会持续更新中!公众号回复【面试题】即可获取。

图片

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值