IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 思维导图|kotlin 反射 -> 正文阅读

[移动开发]思维导图|kotlin 反射

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

图片

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:33:43  更:2021-08-31 15:35:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年5日历 -2025/5/3 14:53:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码