Kotlin学习笔记18 反射Part2
参考链接
示例来自bilibili Kotlin语言深入解析 张龙老师的视频
12 通过KClass获取泛型类型参数
/*** 通过KClass获取泛型类型参数*/class MyTestClass<K,V> {val k:K ? = nullval v:V ? = null
}fun main() {// 获取KClass对象val myTestClassType = MyTestClass::class// 获取泛型的类型集合println(myTestClassType.typeParameters)println(myTestClassType.typeParameters.size)println("first property type "+myTestClassType.typeParameters[0])println("second property type "+myTestClassType.typeParameters[1])
}class HelloKotlin12 {}
13 通过KClass获取一个类的父类信息
/*** 通过KClass获取一个类的父类信息*/class MySerializable:Serializable,MyInterface
interface MyInterfacefun main() {val mySerializable = MySerializable::classprintln(mySerializable.superclasses)
}class HelloKotlin13 {}
14 通过KClass获取一个类的属性信息
/*** 通过KClass获取一个类的属性信息*/class MyTestClass2(var a:String,val flag:Boolean,var age:Int)fun main() {val myTestClass2 = MyTestClass2::classprintln(myTestClass2.memberProperties)
}class HelloKotlin14 {}
15 通过KClass获取一个类的普通方法
/*** 通过KClass获取一个类的普通方法*/
class MyTestClass3{fun printSth(){println("printSth")}fun getSth():String{return "getSth"}
}fun main() {val myTestClass3 = MyTestClass3::classprintln(myTestClass3.memberFunctions)
}class HelloKotlin15 {}
16 通过KClass获取一个类的构造方法
/*** 通过KClass获取一个类的构造方法*/
class MyTestClass4(value: Int) {constructor(value: Int, color: String) : this(value) {println("secondary constructor with string")}constructor(value: Int, full: Boolean) : this(value) {println("secondary constructor with boolean")}
}fun main() {val myTestClass4 = MyTestClass4::classval constructors = myTestClass4.constructorsprintln(constructors)
}class HelloKotlin16 {}
17 通过KClass获取一个类的普通方法并调用
/*** 通过KClass获取一个类的普通方法并调用* 通过判断方法名称调用*/
class MyTestClass5 {fun printSomething(name: String) {println("printSomething $name")}fun printNothing() {println("printNothing")}
}fun main() {// 获取MyTestClass5的KClassval myTestClass5 = MyTestClass5::classval myTestClass5Instance = MyTestClass5()// 通过MyTestClass5的KClass 根据方法名查找方法val functionToInvoke1 = myTestClass5.functions.find { it.name == "printSomething" }// 调用指定instance的相应方法functionToInvoke1?.call(myTestClass5Instance, "AAAA")val functionToInvoke2 = myTestClass5.functions.find { it.name == "printNothing" }functionToInvoke2?.call(myTestClass5Instance)
}class HelloKotlin17 {}
18 通过KClass获取一个类的属性并调用其get方法
/*** 通过KClass获取一个类的属性并调用其get方法* 通过判断属性名称调用*/
class MyTestClass6() {var name: String = "hello"
}fun main() {// 获取MyTestClass6的KClassval myTestClass6Class = MyTestClass6::classval myTestClass6Instance = MyTestClass6()val propertyToInvoke = myTestClass6Class.memberProperties.find { it.name == "name" }println(propertyToInvoke?.call(myTestClass6Instance))// 反射调用属性1println(propertyToInvoke?.get(myTestClass6Instance))// 反射调用属性2println(propertyToInvoke?.getter?.call(myTestClass6Instance))// 反射调用属性3
}class HelloKotlin18 {}
19 通过KClass获取一个类的属性并get set它的值
/*** 通过KClass获取一个类的属性并get set它的值* 通过判断属性名称调用*/
class MyTestClass7{var name: String = "hello"var authorName: String = "Tom"
}fun main() {// 获取MyTestClass6的KClassval myTestClass7Class = MyTestClass7::classval myTestClass7Instance = MyTestClass7()val propertyToInvoke = myTestClass7Class.memberProperties.find { it.name == "name" }println(propertyToInvoke?.call(myTestClass7Instance))// 反射调用属性1println(propertyToInvoke?.get(myTestClass7Instance))// 反射调用属性2println(propertyToInvoke?.getter?.call(myTestClass7Instance))// 反射调用属性3println(myTestClass7Instance.name)if (propertyToInvoke is KMutableProperty<*>){// 反射获取属性的set方法并调用propertyToInvoke.setter.call(myTestClass7Instance,"hi")}println(propertyToInvoke?.call(myTestClass7Instance))// 反射调用属性1println(propertyToInvoke?.get(myTestClass7Instance))// 反射调用属性2println(propertyToInvoke?.getter?.call(myTestClass7Instance))// 反射调用属性3println(myTestClass7Instance.name)
}class HelloKotlin19 {}
20 通过KClass获取一个类的伴生对象 并反射调用伴生的方法
/*** 通过KClass获取一个类的伴生对象 并反射调用伴生的方法*/class MyTestClass8{companion object{fun method(){println("method")}}
}fun main() {val myTestClass8Class = MyTestClass8::classval companionObj = myTestClass8Class.companionObjectprintln(companionObj)val methodToInvoke = companionObj?.functions?.find { it.name == "method" }methodToInvoke?.call(MyTestClass8)// 反射调用MyTestClass8.method()//正常调用
}class HelloKotlin20 {}
21 通过KClass反射创建实例
/*** 通过KClass反射创建实例* 反射调用无参构造方法*/class MyTestClass9(val value: Int = 0) {fun printSomething(name: String) {println("printSomething $name")}fun printNothing() {println("printNothing $value")}
}fun main() {val myTestClass9KClass = MyTestClass9::class// 反射创建实例 调用的是无参构造方法val myTestClass9Instance = myTestClass9KClass.createInstance()// 反射查找方法并调用指定对象的该方法myTestClass9KClass.functions.find { it.name == "printSomething" }?.call(myTestClass9Instance, "AAA")myTestClass9KClass.functions.find { it.name == "printNothing" }?.call(myTestClass9Instance)
}class HelloKotlin21 {}
22 通过KClass反射调用有参构造方法
/*** 通过KClass反射调用有参构造方法*/class MyTestClass10(var name: String) {var price = 0.0constructor() : this("默认商品") {price = 0.0}constructor(name: String, price: Double) : this(name) {this.price = price}
}fun main() {val myTestClass10KClass = MyTestClass10::class// 反射调用无参构造方法val myTestClass10Instance = myTestClass10KClass.createInstance()println(myTestClass10Instance.name)println(myTestClass10Instance.price)// 反射调用属性println(myTestClass10KClass.memberProperties.find { it.name == "name" }?.call(myTestClass10Instance))println(myTestClass10KClass.memberProperties.find { it.name == "price" }?.call(myTestClass10Instance))// 反射调用有参构造方法val cons = myTestClass10KClass.constructorscons.forEach {if (it.parameters.size == 2) {val instance2 = it.call("python", 34)println(myTestClass10KClass.memberProperties.find { it.name == "name" }?.call(instance2))println(myTestClass10KClass.memberProperties.find { it.name == "price" }?.call(instance2))}}
}class HelloKotlin22 {}
23 通过KClass获取一个类的普通方法并调用
/*** 通过KClass获取一个类的普通方法并调用* 通过判断参数个数调用*/
class MyTestClass11 {fun printSomething(name: String) {println("printSomething $name")}fun printNothing() {println("printNothing")}
}fun main() {// 获取MyTestClass5的KClassval myTestKClass11 = MyTestClass11::classval myTestKClass5Instance = myTestKClass11.createInstance()// 根据参数个数查找普通方法val functions = myTestKClass11.functionsfor (function in functions) {// 调用1个参数的普通方法// 注意对比构造方法的反射调用 因为普通方法比构造方法来说 多一个参数(实例对象)// 因此一般一个参数的普通方法 在反射时有两个参数if (function.parameters.size == 2) {function.call(myTestKClass5Instance, "xxxx")}// 调用0个参数的普通方法if (function.parameters.size == 1) {function.call(myTestKClass5Instance)}}
}class HelloKotlin23 {}
24 通过KClass获取一个类的属性并get set它的值
/*** 通过KClass获取一个类的属性并get set它的值* 通过判断属性名称 并使用KMutableProperty1或KProperty1 调用* 可以对比HelloKotlin19的例子*/class MyTestClass12 {var name: String = "Flutter"val price: Double = 34.5
}fun main() {val myTestClass12KClass = MyTestClass12::classval myTestClass12Instance = myTestClass12KClass.createInstance()// memberProperties是KProperty1类型 只有get方法val properties = myTestClass12KClass.memberPropertiesproperties.forEach {when (it.name) {"name" -> {// KMutableProperty1 包含了set和get方法// 其中的泛型的第一个参数是接收者类型 也是当前属性所依附的对象类型// 其中的泛型的第二个参数是当前属性类型val kMutableProperty = it as KMutableProperty1<MyTestClass12, String>kMutableProperty.set(myTestClass12Instance, "Kotlin")println(it.get(myTestClass12Instance))}"price" -> {println(it.get(myTestClass12Instance))}}}}class HelloKotlin24 {}
25 顶层变量的反射 vs 普通变量的反射调用
/*** 顶层变量的反射 vs 普通变量的反射调用*/
class MyTestClass13 {// 普通变量var name: String = "Flutter"
}
// 顶层变量
var test = "test"
fun main() {// 顶层变量的反射调用val topProp = ::testtopProp.set("changed value")println(topProp.get())println(test)// 普通变量的反射调用println("==========通过实例反射调用属性========")// 通过实例反射调用属性val myTestClass13Instance = MyTestClass13::class.createInstance()val name = myTestClass13Instance::namename.set("ruby")println(name.get())println("==========通过KClass反射调用属性========")// 通过KClass反射调用属性val name2 = MyTestClass13::namename2.set(myTestClass13Instance,"Kotlin")println(name2.get(myTestClass13Instance))
}
class HelloKotlin25 {}
26 查找一个用作Kotlin属性的getter的幕后字段或Java方法
/*** 查找一个用作Kotlin属性的getter的幕后字段或Java方法*/
class MyTestClass14 {var name: String = "java"val price: Double = 34.5
}
var myTest = "myTest"fun main() {val topProp = ::myTestprintln(topProp.javaField)println(topProp.javaSetter)println(topProp.javaGetter)val n = MyTestClass14::nameprintln(n.javaField)println(n.javaSetter)println(n.javaGetter)val p = MyTestClass14::priceprintln(p.javaField)println(p.javaGetter)
}
class HelloKotlin26 {}
Kotlin学习笔记18 反射Part2相关推荐
- Kotlin学习笔记17 反射Part1
参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 获取Java class和Kotlin KClass的方法 // 获取Java class和Kotlin KClass ...
- Kotlin学习笔记28 Flow part2 Flow引入 Flow的执行 取消 构建器 中间操作符 终端操作符 默认执行顺序 上下文相关
参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 一个方法返回多个结果各种实现 /*** 一个方法返回多个结果* 方式1 返回一个集合* 特点* 1 方法本身是阻塞的 ...
- Kotlin学习笔记20 阶段复习2
参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 lambda表达式 内联函数 Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数_积跬步 至千里- ...
- Kotlin学习笔记(1)-- 基础语法
文章目录 Kotlin学习笔记(1)-- 基础语法 输出 语法 代码 输出 可读可改(var) 语法 代码 输出 内置数据类型 只读变量(val) 类型推断 编译时常量 语法 代码 输出 引用类型 r ...
- Kotlin学习笔记(一)
文章目录 Kotlin学习笔记 变量申明 只读变量 类型推断 编译时常量 引用类型和基本数据类型 if表达式 when String 模板 函数头 函数参数 Unit函数 Nothing类型 反引号中 ...
- Kotlin 学习笔记(八)—— Kotlin类与对象之接口
Kotlin 学习笔记(八)-- Kotlin类与对象之接口 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- 基础 ...
- Hadoop学习笔记—18.Sqoop框架学习
Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...
- Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel
Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只有单元格会进入编辑模式,而行编辑模式中则对编辑行的所有可编辑字段统一进行 ...
- Kotlin学习笔记(3)- 语法
系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!kotlin学习笔记系列首发简书和CSDN Kotlin学习笔记(1)- 环 ...
最新文章
- clickhouse 航空数据_趣头条基于Flink+ClickHouse的实时数据分析平台
- 博客积分规则 博客等级
- 使用jquery调试ajax接口
- 云电脑是什么_云电脑为什么发布新1代5G无影?带你了解PC
- Win10用户远超4亿 Win10 RS2明年年初发布
- bezier曲线_套娃成神:贝塞尔曲线
- Spring Swagger URL传参问题(转)
- MVC中使用KindEditor
- 了解SQL Server数据库静态数据及其如何适合数据库生命周期管理
- java形状函数_java基础:10.4 Java FX之形状
- 2017-02-26,周日整理
- PAT1030.——完美数列
- 联想7400打印机如何与手机连到一起_2020年打印机推荐选购,看这篇就够了
- USB3.0视频输出方案
- io-nio-socket步步为营(七) IO模型-心得体会
- windows服务器系统发展史,从1.0到Win10:Windows操作系统进化史
- 开源的压力测试工具 PyLot
- Day3 分支和循环
- 【论文解读】Self-Explaining Structures Improve NLP Models
- workflow 添加html,为alfred编写workflow
热门文章
- 使用cloudbase-init初始化windows虚拟机
- asp.net core-5.控制台读取json文件
- js 把对象按照属性名的字母顺序进行排列
- uva 10891 - Game of Sum
- 2013 年亚洲赛杭州赛区卡题总结
- Haoop0.20.1+Ubuntu11.10+Eclipse3.5.2
- Google code jam 2008, Qualification Round:Save the Universe, 翻译
- linux 线程池编程,Linux-C-9-线程池编程
- 深度优先搜索——单词接龙(洛谷 P1019)
- mysql主从注意事项_mysql主从复制亲测,以及注意事项