聊聊Kotlin中的元编程_kotlin元编程-程序员宅基地

技术标签: 笔记  android  

背景

首先还是来说下为什么出现元编程?
一个技术的出现肯定是不满足现状,那么元编程的出现是为了解决什么问题呢?举一个栗子,比如我们需要获取某个类的属性进行赋值取值或者获取函数信息进行调用时,我们当然可以编写代码以让外界访问这些数据,但是这样做容易出错而且特别麻烦,这个时候我们可以想到利用反射也可以达到同样的效果。对吧,获取类变量,函数信息这看起来就是反射可以做到的事情,所以其实反射也属于元编程范畴。

什么是元数据

顾名思义,元数据和元注解一个道理,元注解是标记注解的注解,元数据自然就是描述数据的数据,这个听起来有点绕口,来解释一些这两个“数据”到底分别指代什么?

描述“数据”的“数据”

我们知道我们的需求也就是程序是通过各种数据构建起来的,这些数据就是指类,函数,变量…等是对现实世界和需求的描述,这就是第一个数据的意思

通过类,变量,函数这些数据去描述需求程序

那么第二个数据也就知道了,是用来描述类,函数,变量的数据,这就是第二个数据的意思,也就是元数据。

通过元数据描述类,变量,函数信息

什么是元编程

直接说定义:操作元数据的编程就是指元编程。
比如我们通过反射获取类,属性,方法的一些信息,进而操作他们这也叫元编程。所以上面说到反射也算元编程的范畴。
但是这么说又太片面了,反射是通过程序获取数据,而元编程还包括通过数据获取程序。即“程序即是数据,数据即是程序”。
可以这么说元编程是更高阶的抽象,高阶函数用函数作为输入输出。而元编程用程序作为输入输出。

程序即是数据

这个很好理解,通过指定的程序来获取构成这个程序的信息,比如一个Book类,我们可以动态的获取这个类中的属性和行为,其实就是反射。

介绍

来看下Java中的反射信息结构
在这里插入图片描述
可以看到有参数,类,包这些信息,AccessibleObject信息代表的是可调用的元素。

比如Field指字段(仅仅代表字段),Excutable代表可执行其中包括构造函数和普通方法。

再来看下Kotlin中的反射结构:
在这里插入图片描述
Kclass代表类信息,Kparameter代表参数信息,而KCallable和Accessible一样代表的都是可调用的元素。
其分为两类,KFunction和KProperty,不同点是:

  • KProperty中包含普通属性和可变属性KMutableProperty,且Kotlin中的属性包含Setter和Getter方法。。而java中的Field只代表这个字段,setget是在另外一个Method结构中
  • KFunction统一了构造函数,包含Kproperty的Setter和Getter。而java中的Method还分为构造函数和普通函数,且是单独的setget方法不是Field自带的
  • Java中反射需要设置可访问性,而Kotlin中的属性自带setget方法通过get可直接获取。也就是KProprity.call(对象实例)即可获取属性。
  • Kotlin中获取信息比Java更明确直观。

Kotlin的增强

和java中的反射一样使用,不同的是Kotlin中由于多了很多特性所以其元数据类型也比java中多,比如:

metaclass描述类的类型kclass。
通过类名::class得到kclass

KClass中相比Java中的Class新增:
在这里插入图片描述

KCallable由于包含着KFunction和KProperty,所以先来看下KCallable中有哪些属性:
KCallable可通过KClass的members成员获取,其返回值是Collection<KCallable<*>>
在这里插入图片描述
通过上面的信息已经可以获取到了类,属性和方法的信息,那么我们该如何获取参数信息呢?
参数信息又分为这三种:方法的参数信息,方法的返回值信息,泛型的参数信息(也就是参数类型)。
可通过KCallable.parameters获取方法的参数信息,返回值是List< KParameter >。
KParameter新增属性:、在这里插入图片描述
可看到通过Kparameter的type属性获取到参数的类型,那么返回值的类型和泛型类型该如何获取呢?
上面讲解KCallable的时候就已经有这两个属性了:

  • 返回值类型:只有方法才有返回值,所以是通过KCallable的returntype属性可以获取到
  • 参数类型:泛型一种是泛型方法还有一种是泛型类。泛型方法一样通过KCallable的typeParameters获取,在KClass中通过startProjectedType属性获取。返回值是List< KTypeParameter >不存在返回一个空的集合。

数据即是程序

这句话该怎么理解。我们倒推一下,通过一些信息来动态创建程序。
比如使用字节码工具ASM,javassist等动态生成类,还有使用KAPT注解处理器通过注解来手动输出程序到一个文件中。可以看到和Kotlin好像没有多大关系,所以Kotlin目前还没法做到动态创建程序。

注解处理器

Kotlin中的注解处理器和Java中的一样,注解参数为常量,作用范围为:

  • 基本类型
  • 字符串
  • Class对象
  • 注解
  • 类型数组,XXXArray

定义方式:比Java中更明显:用annotation修饰类即可。
使用方式:
1.添加注解处理器信息。这需要在classpath里包含META-INFO/services/javax.annotation.processing.Processor文件,并将注解处理器包名和类名写入该文件。
2.使用kapt插件。如果是gradle工程可以通过apply plugin:'kotlin-kapt’添加注解处理器支持。
kapt也支持生成Kotlin代码。

缺点

虽然annotation processor允许开发人员访问程序AST(抽象语法树可查看之前文章JVM编译只是),但没有提供行之有效的代码生成方案,目前仅有的代码生成方案也仅仅是将代码以字符串的形式写入新文件,而无法做到直接将生成的AST作为程序。这也说明了Java和Kotlin目前不具备同像性。

元编程的使用范围

1.外部程序:kotlin的语法糖suger,最终会变成java文件。所以编译器承担了 解语法糖 的角色,编译器作为外部程序去操作这些语法糖(本质也是元数据)也叫作元编程
2.获取运行时数据(反射)
3.动态执行代码(目前无法做到)

元编程需要一定的学习成本,需要了解class结构和kclass等相关程序构成的数据。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45272690/article/details/124367835

智能推荐

C++转MATLAB实现(可用OpenCV库)_c语言做的系统迁移到matlap-程序员宅基地

文章浏览阅读7.9k次,点赞12次,收藏50次。Matlab与C++混合编程(依赖OpenCV)[email protected]://blog.csdn.net/zouxy09 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子。实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口。这样一方面可以在Matlab中利用已经编写好的函数,尽管..._c语言做的系统迁移到matlap

密码学基础——辗转相除法,费马小定理,欧拉定理,裴蜀定理,中国剩余定理_如何用辗转相除法求数论倒数-程序员宅基地

文章浏览阅读4k次,点赞3次,收藏10次。文章主要根据百度百科和维基百科相关相关知识点整理而成!辗转相除法辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。另一种求两数的..._如何用辗转相除法求数论倒数

JAVA中如何判断一个输入是数字(小数和整数)还是字符串?_判断某个值是数值还是字符串-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏4次。public class Test1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入数值:"); String s = input.next(); if (s != null && s.matches("^[0.0-9.0]+$")) {// [0-9]没办法..._判断某个值是数值还是字符串

【tomcat】如何修改tomcat的默认项目-程序员宅基地

文章浏览阅读49次。我们知道,在Tomcat安装、配置、启动成功后在浏览器地址栏输入http://localhost:8080会访问到Tomcat的默认主页。然后我们打开Tomcat的webapps目录时,会发现里面有我们自己的一些项目文件夹与一个ROOT文件夹。ROOT文件是什么?如果我们做个试验,把ROOT文件夹删掉,在次输入http://localhost:8080就会发现页面一片空白,但此...

R语言期末大作业_r语言大作业-程序员宅基地

文章浏览阅读3.3w次,点赞57次,收藏599次。自选数据集对之进行相应处理一、题目要求数据分析与挖掘要求(1)按照后续分析需求,对数据进行预处理。(2)描述性统计:选择合适的方法对数据进行统计分析。包括对数值型和类别型属性的统计,并对分析结果进行图形化的展示。(3)推断性统计:选择合适的假设检验方法,分析属性间的相关性、两组数据间是否具有显著性差异,并得出结论。(4)数据挖掘分别利用分类、聚类以及时间序列方法挖掘蕴含在数据中的模式..._r语言大作业

随便推点

大数据各岗位薪资多少?一张图告诉你答案_云计算工资水平折现图-程序员宅基地

文章浏览阅读2.5k次。目前,借由大数据时代的高速发展,它的岗位需求开始迅速扩张,从而给想从事大数据行业的人带来了大量的发展机会,同时也为大家提供了大量的职业发展通道。那么,在这个高速运转的时代,面对如此众多的大数据就业岗位的时候,我们应该去选择什么样的职业发展方向并努力的去学习相应技能从而达到企业要求呢?根据我们行业内各大权威的机构预测,在2020年期间,大数据行业在大数据相关岗位需求中不断激增,这其中Java大数据工程师的缺口大约会在14万到19万人之间,对于懂得如何利用大数据做决策的分析师和经理的岗位缺口则将达到150万_云计算工资水平折现图

大数据法律监督模型优势特色及应用场景_大数据监管算法模型-程序员宅基地

文章浏览阅读1.4k次。大数据法律监督平台是基于监督数据整合管理平台、监督模型构建平台、内置模型库以及法律监督线索管理平台打造的一套服务于检察机关法律监督工作的专业化系统。_大数据监管算法模型

29-Nor Flash电路设计-程序员宅基地

文章浏览阅读1.2k次,点赞11次,收藏32次。nor flash硬件电路设计_nor flash电路设计

基于Springboot高校校园教室预约系统设计与实现_大学校园教室预约系统-程序员宅基地

文章浏览阅读1.9k次,点赞6次,收藏2次。《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,程序员宅基地专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,免费项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!_大学校园教室预约系统

html label设置行高,UILabel 显示HTML 设置行高-程序员宅基地

文章浏览阅读197次。UILabel *label = [[UILabel alloc] init];label.font = [UIFont systemFontOfSize:15];UIFont*font = label.font;//转换HTML 字符串NSDictionary *options = @{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,..._html label行高

2024年10个最佳人工智能视频生成器、10个最佳人工智能转录软件和服务、10个最佳人工智能语音生成器、10个最佳文本转语音生成器,优缺点对比分析及附访问地址可打开直接使用_脚本自动生成视频 软件-程序员宅基地

文章浏览阅读1.1k次,点赞16次,收藏23次。2024年10个最佳人工智能视频生成器、10个最佳人工智能转录软件和服务、10个最佳人工智能语音生成器、10个最佳文本转语音生成器,优缺点对比分析及附访问地址可打开直接使用。_脚本自动生成视频 软件

推荐文章

热门文章

相关标签