八、Kotlin 反射

news2024/10/6 8:34:58

1. 什么是反射

反射是允许在运行时期访问 程序结构 的一类特性(程序结构包括:类、接口、方法、属性等)。

2. 反射的依赖库

Kotlin 中不仅自己实现了一套 Kotlin 反射的 API,还可以使用 Java 反射的 API

Kotlin 反射的 API 是一个独立的库,使用之前需要进行依赖配置:

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-reflect" // Kotlin反射 API 的依赖库
}

在这里插入图片描述

3. @MetaData 注解

Kotlin 代码反编译成 Java 代码后,Java 代码中每个类都会被注解 @MetaData 修饰。注解 @MetaData 中保存了 Kotlin 反射相关的信息。

4. 反射的使用场景

  1. 获取类型的所有属性、方法、内部类等信息(即通过反射来访问程序本身,所以又可以称为自省)。

  2. 通过方法的名称字符串及签名字符串来调用方法;通过属性的名称字符串来访问属性。

  3. 通过签名信息获取泛型实参的具体类型。

  4. 访问运行时注解及其信息完成注入或者配置操作。

5. 反射中与程序结构相关的类

5.1 KType

描述未擦除的类型或泛型参数等,例如 Map<String, Int>

可通过 typeOf 或者类型 KClassKPropertyKFunction 获取对应的父类、属性、函数参数等。

5.2 KClass

描述对象的实际类型,不包含泛型参数,例如 Map

可通过对象、类型名直接获得 KClass 实例。

5.3 KProperty

描述属性。

可通过属性引用、属性所在类的 KClass 实例获取。

5.4 KFunction

描述函数。

可通过函数引用、函数所在类的 KClass 实例获取。

5.5 KotlinJava 中程序结构相关类的对比

KotlinJava
KTypeType
KClassClass
KPropertyField
KFunctionMethod

6. Java 反射与 Kotlin 反射的优缺点

Java 反射:

  1. 优点:无需引入额外依赖,首次使用速度相对较快。

  2. 缺点:无法访问 Kotlin 语法特性,需对 Kotlin 生成的字节码足够了解(只有了解其字节码才能知道 Java 反射中如何处理 Kotlin 代码)。

Kotlin 反射:

  1. 优点:支持访问 Kotlin 几乎所有特性,API 设计更友好。

  2. 缺点:需要额外引入 Kotlin 反射依赖库(2.5M,编译后 400K),首次调用较慢(需要解析注解 @MetaData 中保存的反射信息)。

7. 反射的使用举例

7.1 通过 “类名::class” 获取 KClass & 通过 KClass 获取程序结构信息

通过 类名::class 可以获取到 Kotlin 类的 KClass 实例。

KClass 类中提供了大量 API 来访问类的程序结构信息(如属性,方法,内部类,等等)。

在这里插入图片描述

7.2 通过 typeOf 获取 KType & 通过 KType 获取泛型信息

通过 Kotlin 反射依赖库提供的全局函 typeOf 获取泛型类型的相关信息。

在这里插入图片描述

7.3 获取类方法的返回值类型上的泛型实参

在这里插入图片描述

7.4 获取父类类型上的泛型实参

在这里插入图片描述

7.5 通过反射获取泛型实参的原理

Kotlin 中的泛型是 伪泛型,即经过编译后的类型上就不会带泛型了。

但是为什么通过 KType 实例还能够拿到类型的泛型信息呢?

这是因为 Kotlin 代码经过编译后会为擦除掉的泛型生成一个签名信息(如下图的 Kotlin 字节码中的 signature 所示):

在这里插入图片描述

通过 KType 实例获取到的泛型信息就是通过解析 signature 签名得到的。

7.6 保留泛型签名信息的混淆配置

在打包混淆时,泛型的签名信息会被混淆。

因此,为了保证通过 KType 实例能够获取到泛型信息,应该在混淆配置文件中保留 signature 签名信息不被混淆:

//Proguard配置
-keepattributes Signature

8. 案例

8.1 数据类的深拷贝

8.1.1 相关知识点
8.1.1.1 反射获取类的主构造器
8.1.1.2 反射获取函数的形参列表
8.1.1.3 反射调用函数
8.1.1.4 反射获取对象中属性的属性值
8.1.2 代码实现

在这里插入图片描述

8.2 Model 映射

需求:实现具有相同属性列表的不同数据类之间的转换。

8.2.1 相关知识点
8.2.1.1 判断类型是否为可空类型
8.2.2 代码实现

在这里插入图片描述

8.3 通过属性代理实现对不可空类型属性的资源释放

8.3.1 相关知识点
8.3.1.1 获取属性代理(KProperty.getDelegate()

调用 KProperty 类的 getDelegate() 方法获取属性代理实例。

8.3.1.2 阻止属性的访问权限检查(isAccessible = true

调用 getDelegate 方法之前,需要设置 isAccessible = true,表示阻止属性的访问权限检查。

8.3.2 代码实现

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1412195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day33WEB 攻防-通用漏洞文件上传中间件解析漏洞编辑器安全

目录 一&#xff0c;中间件文件解析漏洞-IIS&Apache&Nginx -IIS 6 7 文件名 目录名 -Apache 换行解析 配置不当 1、换行解析-CVE-2017-15715 2、配置不当-.htaccess 配置不当 -Nginx 文件名逻辑 解析漏洞 1、文件名逻辑-CVE-2013-4547 2、解析漏洞-nginx.conf …

ECharts 中 Legend自定义可以使用svg标签

效果图&#xff1a; legend图例加载svg标签 在ECharts中&#xff0c;图例(legend)组件的formatter属性允许你自定义图例文本的格式。但是&#xff0c;formatter属性不支持直接加载SVG标签或Html。它接受一个字符串或者一个函数作为输入&#xff0c;并不能解析或渲染SVG。 如果…

探索 DevOps 中的自动化技术

DevOps 是一种强调开发与 IT 运营之间合作的软件开发范式&#xff0c;主要依靠自动化来优化流程、提高生产力并确保及时、可靠的软件交付。以下是对 DevOps 不可或缺的关键自动化技术的探索&#xff1a; 1.持续集成/持续部署&#xff08;CI/CD&#xff09; 在 DevOps 领域&…

WebSocket服务端数据推送及心跳机制(Spring Boot + VUE):

文章目录 一、WebSocket简介&#xff1a;二、WebSocket通信原理及机制&#xff1a;三、WebSocket特点和优点&#xff1a;四、WebSocket心跳机制&#xff1a;五、在后端Spring Boot 和前端VUE中如何建立通信&#xff1a;【1】在Spring Boot 中 pom.xml中添加 websocket依赖【2】…

Java程序设计(猜拳、猜数字、猜硬币)

前言 Java实现简单的程序设计&#xff0c;包含猜拳、猜数字和猜硬币&#xff0c;实现玩家和电脑之间的互动&#xff0c;电脑每次出的结果实现随机&#xff0c;玩家选择需要玩的游戏&#xff08;猜拳、猜数字、猜硬币&#xff09;&#xff0c;选择需要进行的局数。 界面设计 程…

pcl+vtk(十四)vtkCamera相机简单介绍

一、vtkCamera相机 人眼相当于三维场景下的相机&#xff0c; VTK是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面&#xff0c;如屏幕、图像等。 相机位置&#xff1a;即相机所在的位置&#xff0c;用方法vtkCamera::SetPosition()设置。 相…

k8s的安全机制

k8s是分布式集群管理工具&#xff0c;k8s作用是容器编排 1、安全机制核心&#xff1a;API server。API server作为整个集群内部通信的中介&#xff0c;也是外部控制的入口&#xff0c;所有的安全机制都是围绕api sserver来进行设计的。请求api server资源要满足3个条件&#x…

数据结构篇-02:最小栈

对于这道题&#xff0c;除了 getMin 外的功能&#xff0c;传统的 栈 结构中都有&#xff0c;所以重点在于如何实现 getMin 方法。 有两类方法&#xff1a;使用辅助栈/不使用辅助栈 使用辅助栈的解法一 定义一个 栈 来实现常规功能&#xff0c;另外定义一个栈&#xff08;最小…

如何配置点击抖音直播小风车跳转到微信公众号?

随着抖音直播间的普及&#xff0c;越来越多的品牌选择通过直播进行宣传推广。然而&#xff0c;直播间主播的氛围营造是一项极具挑战性的任务。如果观众的热情无法被调动起来&#xff0c;直播间很容易陷入沉寂&#xff0c;难以吸引流量。 为了最大化利用流量&#xff0c;许多品牌…

智能充电桩,机器人 wifi蓝牙 解决方案

新联鑫威低功耗高性价比sdio wifi/蓝牙combo的模块单频2.4g的CYWL6208&#xff0c;双频2.4g/5g CYWL6312可以应用到一些低延时 高性能 低功耗 联网需求的交流直流充电桩&#xff0c;扭力扳手&#xff0c;agv机器人&#xff0c;目前支持主流的stm32F4/GD32F4 瑞萨 psoc的主控&am…

道合顺:一站式电子元器件采购商城

欢迎来到道合顺&#xff0c;您专属的电子元器件采购商城。我们为您提供广泛的元器件选择&#xff0c;包括各类芯片、传感器、电容电阻、连接器等&#xff0c;以满足您项目的需求。 最新价格实时查询 通过道合顺电子网&#xff0c;您可以随时随地查询各类电子元器件的最新价格…

外汇天眼:QoinTech误信假老师话术投资外汇,惨遭黑平台滑点爆仓拒出金

去年11月与12月&#xff0c;外汇天眼先后发布了「钓鱼广告诱加投资群组&#xff0c;限制出金逼迫缴分成费」与「假投顾诱导投资黄金获利&#xff0c;黑平台操作爆仓狠诈700万」这2篇文章&#xff0c;曝光黑平台QoinTech的诈骗手法&#xff0c;呼吁投资人不要上当&#xff0c;没…

你对 TypeScript 中枚举类型的理解?应用场景?

文章目录 一、是什么二、使用数字枚举字符串枚举异构枚举本质 三、应用场景参考文献 一、是什么 枚举是一个被命名的整型常数的集合&#xff0c;用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说&#xff0c;枚举就是一个对象的所有可能…

LeetCode 热题 100 | 普通数组

目录 1 53. 最大子数组和 2 56. 合并区间 3 189. 轮转数组 4 238. 除自身以外数组的乘积 5 41. 缺失的第一个正数 菜鸟做题第二周&#xff0c;语言是 C 1 53. 最大子数组和 题眼&#xff1a;“子数组是数组中的一个连续部分。” 遍历数组&#xff0c;问每一个元素…

EIGRP实验

实验大纲 一、基本配置 1.构建网络拓扑结构图 2.路由器基本配置 3.配置PC 4.测试连通性 5.保存配置文件 二、配置EIGRP 1.查看路由表 2.配置EIGRP动态路由 3.查看路由器路由表 4.测试网络连通性 5.查看所有路由器的路由协议 6.保存配置文件 三、配置OSPF 1.配置…

【基于电商履约场景的 DDD 实战】DDD领域驱动设计的优势分析以及与MVC架构对比

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复…

LeetCode.2859. 计算 K 置位下标对应元素的和

题目 题目链接 分析 这道题的题意很明确。就是求每一个下标的二进制中1的个数为k的下标所对应的元素值之和。 Java 中有 库函数 Integer.bitCount(num)&#xff0c;这个函数的返回值就是 num 中 1 的个数。 代码 class Solution {public int sumIndicesWithKSetBits(List…

如何训练和导出模型

介绍如何通过DI-engine使用DQN算法训练强化学习模型 一、什么是DQN算法 DQN算法&#xff0c;全称为Deep Q-Network算法&#xff0c;是一种结合了Q学习&#xff08;一种价值基础的强化学习算法&#xff09;和深度学习的算法。该算法是由DeepMind团队在2013年提出的&#xff0c;…

开发板连接错误: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

1.出现错误 scp rkmedia_vi_venc_rtsp_test_sp root192.168.10.198:/home/sunpeng出现错误 2.错误原因&#xff1a;警告&#xff1a;远程主机标识已更改&#xff01; 1&#xff09;重新烧录开发板系统&#xff0c;导致IP地址变化。 2&#xff09;报警错误-中文&#xff08;警…

每日一练 | 华为认证真题练习Day172

1、关于OSPF的ASBR-SUMMARY-LSA中LSA头部他、信息描述错误的是 A. LINK STATE ID表示ASBR的ROUTER ID B. ADVERTISING ROUTER表示该ABR的ROUTER ID C. ADVERTISING ROUTER字段永远不会改变 D. METRIC表示该ABR到达ASBR的OSPF开销 2、关于OSPF外部路由种类描述错误的是 A. …