参考链接

示例来自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相关推荐

  1. Kotlin学习笔记17 反射Part1

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 获取Java class和Kotlin KClass的方法 // 获取Java class和Kotlin KClass ...

  2. Kotlin学习笔记28 Flow part2 Flow引入 Flow的执行 取消 构建器 中间操作符 终端操作符 默认执行顺序 上下文相关

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1  一个方法返回多个结果各种实现 /*** 一个方法返回多个结果* 方式1 返回一个集合* 特点* 1 方法本身是阻塞的 ...

  3. Kotlin学习笔记20 阶段复习2

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 lambda表达式 内联函数 Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数_积跬步 至千里- ...

  4. Kotlin学习笔记(1)-- 基础语法

    文章目录 Kotlin学习笔记(1)-- 基础语法 输出 语法 代码 输出 可读可改(var) 语法 代码 输出 内置数据类型 只读变量(val) 类型推断 编译时常量 语法 代码 输出 引用类型 r ...

  5. Kotlin学习笔记(一)

    文章目录 Kotlin学习笔记 变量申明 只读变量 类型推断 编译时常量 引用类型和基本数据类型 if表达式 when String 模板 函数头 函数参数 Unit函数 Nothing类型 反引号中 ...

  6. Kotlin 学习笔记(八)—— Kotlin类与对象之接口

    Kotlin 学习笔记(八)-- Kotlin类与对象之接口 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- 基础 ...

  7. Hadoop学习笔记—18.Sqoop框架学习

    Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...

  8. Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel

    Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只有单元格会进入编辑模式,而行编辑模式中则对编辑行的所有可编辑字段统一进行 ...

  9. Kotlin学习笔记(3)- 语法

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!kotlin学习笔记系列首发简书和CSDN Kotlin学习笔记(1)- 环 ...

最新文章

  1. clickhouse 航空数据_趣头条基于Flink+ClickHouse的实时数据分析平台
  2. 博客积分规则 博客等级
  3. 使用jquery调试ajax接口
  4. 云电脑是什么_云电脑为什么发布新1代5G无影?带你了解PC
  5. Win10用户远超4亿 Win10 RS2明年年初发布
  6. bezier曲线_套娃成神:贝塞尔曲线
  7. Spring Swagger URL传参问题(转)
  8. MVC中使用KindEditor
  9. 了解SQL Server数据库静态数据及其如何适合数据库生命周期管理
  10. java形状函数_java基础:10.4 Java FX之形状
  11. 2017-02-26,周日整理
  12. PAT1030.——完美数列
  13. 联想7400打印机如何与手机连到一起_2020年打印机推荐选购,看这篇就够了
  14. USB3.0视频输出方案
  15. io-nio-socket步步为营(七) IO模型-心得体会
  16. windows服务器系统发展史,从1.0到Win10:Windows操作系统进化史
  17. 开源的压力测试工具 PyLot
  18. Day3 分支和循环
  19. 【论文解读】Self-Explaining Structures Improve NLP Models
  20. workflow 添加html,为alfred编写workflow

热门文章

  1. 使用cloudbase-init初始化windows虚拟机
  2. asp.net core-5.控制台读取json文件
  3. js 把对象按照属性名的字母顺序进行排列
  4. uva 10891 - Game of Sum
  5. 2013 年亚洲赛杭州赛区卡题总结
  6. Haoop0.20.1+Ubuntu11.10+Eclipse3.5.2
  7. Google code jam 2008, Qualification Round:Save the Universe, 翻译
  8. linux 线程池编程,Linux-C-9-线程池编程
  9. 深度优先搜索——单词接龙(洛谷 P1019)
  10. mysql主从注意事项_mysql主从复制亲测,以及注意事项