00:00
好,同学们,我们来看一下啊,接着往下看。呃,那么上午呢,我们给同学们介绍了一下它的一个简单的应用场景,那下面呢,我们就来看反射的基本介绍,首先各位同学我们在学任何一样东西呢,先把它的一个简单的原理搞清楚哈,因为反射里面呢有大量的这个函数。呃,它的难度呢,是在这个函数的应用上面,首先我们看反射可以在运行的时候动态的获取变量的各种信息。什么信息呢?比如变量的类型,变量的这个类别。那么类型和类别呢,它是有区别的,一般来讲,从英文这个字母来说呢,我们类型叫type。那么类别呢,我们叫CAD,哎,它是有一点小小区别的,那么如果说你的这个变量是基本数据类型,其实这两者呢,诶它是相同的,那如果你这个变量是结构体,它这个类类型和类别呢,它是不一样的,待会我们还要举例,这是第一点。
01:05
如果你这个结构体变量好,如果你这个是结构体的一个实例。啊,当然我们也可以叫变量,还可以获取到结构体本身的信息,比如说它的字段呢,它的方法呀等等。这是第二个,它的用处,还有通过反射我们可以修改这个变量的值,就把它只修改了,当然我们用的是变量加引用的传递,还可以调用关联的方法,你比如说我通过反射,可以以反射的方式去调用结构体的方法。哎,这样子的,那么在使用反射的时候呢,我们用到一个非常重要的包叫reflect,好,最后呢,我要画一个示意图。这个示意图对我们来说特别重要啊,如果我这不画一个示意图告诉你,我讲的时候都都容讲讲懵圈,这个示意图其实挺简单,但是他很有指导意义,我们先来看一下刚才老师说的这么几点啊,就是这一句话,就是反射怎么去理解,我画一个示意图,打开我们SL文档,你可以这样理解它的一个反射的原理,或者反射要做的事吧。
02:15
啊,比如说我们说一下这个反射的示意图,哎,反射的一个示意图,那么你可以这么理解,比如说各位同学,比如说各位同学这个地方是我们的一个变量。啊,这个地方是我们的一个变量。那么这个变量呢,可能是基本数据类型对不对啊,是个变量,比如说你这可能是一个非常简单的一个number基本数据类型,当然了,你这也有可能是一个结构体啊,当然也可能是个结构体,比如说你写了一个student,它的它的类型呢,是在大这个student ST dt,也就是说你这个地方呢,也有可能是一个结构体,然后他们的类型,你看这是基本数据类型对不对?
03:03
啊OK,基本数据类型这个呢,是它的一个什么呢?诶是它的这个我们叫做结构体,那各位同学大家知道,对于一个结构基本数据类型来说呢,它还是比较啊比较单纯一点的,因为基本数据类型大家来说,一般我们不会把一个方法。绑定到一个基本数据的去,当然它可以啊,我们不是说它不行,它是可以的,就是说如果你给这个int取一个别名,其实也是可以给它绑定一个相关方法的,对吧,那么但是呢,一般情况下呢,我我们不会,那如果是结构体的话,这个就相对复杂一点,比如说各位同学听我讲,那假如你的这个student,它的结构体的这个声明,它大致是这样子的,比如说我举个例子,太婆注意听啊,这是我们的一个student。To student,那么那么这个student里面呢,假如有一些个字段,比如说内蒙字段。
04:04
对不对,比如说有H这个字段啊,当然可能还会有很多其他的这个我就不去写它了,那除了结构体,我们有这个什么呢?有方法之外呢,各位同学,呃,有字段之外呢,我们往往还会有一些方法,比如说我们有这样一个方法跟它绑定的对,比如说z s student dt啊,然后呢,比如说这个叫做呃,叫做这个print吧,我就随便写一个,但这里面还有参数,假如假如说有有参数啊,Int,我四个亿里面呢,有你的代码。这边有你的代码,就是你做做些什么事情的代码好写完了。写完了,那老说这些有什么用呢?现在我们就把我们的反射引出来。那反射有什么东西呢?反射里面有两个特别重要的类型,一个叫type,一个叫value。打开我们手册。好,我们来看看这个反射跟我们所说的这两这个变量和它的这些定义之间会有什么关联关系,好,打开我们的手册,好。
05:12
好,打开这个手册。我们来登下路。哎,我们来登到网上去啊,脚够。Go,官方对官方网官。官方的一个手册。好,我们进去看一下。待会儿我们要大力用这个手册啊,同学们不要蒙圈,这个呢也不难,就你只要理解了,你就不会难,Reflect。Reflect,下边就他。啊,那么这个里边干什么呢?我们先来看一下它这个基本介绍啊,同学们看到这里他说啊,Flag包实现了运行反射。运行反射允许程序操作任意类型的对象啊,其实这个对象呢,呃,叫实例也可以,叫变量也可以啊,经典的用法是什么?什么用的,怎么用的啊,下面有各种用例,它前面说到两个关键点,一个它可以调用type of获取其类型信息。
06:10
什么类型呢?Type,还有呢,调用value of可以反复一个value value类型值,那这两个是它最核心的两个字,那么这两个字有什么东西呢?大家可以看到一个是它,各位同学请看一个这个东西。一个就是type value,六为什么说这两个很重要呢?你看啊,你如果点到这里面去,你你会发现这个type里面的类型内容很多,它其实是一个接口,它其实是一个接口,是什么接口呢?它实现了很就是它定义了很多很多的这种方法,看方法非常的多,那你通过这个type可以干什么事呢?就说如果你通过反射来获取到这个type,你就可以拿到这个类型,这个通过反射获取到该变量的CAD。
07:04
名字包路径,尺寸大小,还有长度BY尺,Element,这个呢是通是这个是指的获通过指针获取它对应的值啊,还有K还可以明字啊,你看还有很多field拿到它的字段。如果你这个地方是反射的这个类型,它是一个结构体的话,你通过这个方法还可以拿到它的一个field,就是字段,同样还可以有很多其他信息,比如说呃,还有它的这个方法,方法代表第几个通过name by name就是通过名字获取方法等等等等。那也就是说第一个我们可以看出来,这个地方一个最重要的东西已然出来了,什么玩意儿呢?就是通过反射我们可以拿到这个信息。啊,通过反射我们可以获取到这样一个类型,叫什么类型呢?叫reflect。
08:02
点type这个类型。好,那它是怎么玩的呢?各位同学注意听啊,它是通过这个方式,比如说你的变量是number或者value,那它关键的一句话就是这个函数。Reflect。Reflect点哦不不不不是不不是啊呃,是啊,对,没没有说错点什么呢?Type of type,这个这个哦,Ooo是大写的。欧式大写的,确认一下啊,欧式大写的。Type of再回到这边来看一下。它它这有两个函数,我们看往下拉是大写的啊没有写错,它可以接受的这个类型大家看清楚了是什么呀,任意类型看到没有,因为它是空接口吗?那空气当时任意类型吗?但是你不要传力啊说老师你传过空有病吗?你传过空的是吧?传空那肯定发挥还是空,因为它通过这个东西呢,把你的这个变量,比如说你的变量是V。
09:04
好,通过这个地方呢,你就拿到了,拿到了它的这个类型,那通过这个类型可以干什么呢?OK,反过来你又通过它又可以反向去操作这个变量明白。哦,原来是这么一回事,但你操作它,你是依赖于人家这个反射包给你提供了什么呀,大量的方法就是你反过来你就可以去操作它。那你操作它的根据是什么。你就是因为你通过这个type,这个家伙的就就type你拿到不是他的这样一个类型吗?通过他给你提供的一系列的这些个方法,哪些方法具体来说就这些。啊。他这些,呃呃不不是这些啊啊,我们进去准准确的讲就通过这些方法,就是你们看到这些方法都可以用。哦,那那你返回这个类型,肯定把这些都给你实现了,对不对,肯定实现了嘛,那你大量的这些方法你都可以玩。
10:04
好,这是它的一个最基本的一个道理啊,同学们,你把这个基本道理明白了过后呢,你会发现,诶,老师待会儿讲的时候你不至于那么蒙圈,而且你还觉得还很清晰啊,这是一大坨,看清楚没有,好,紧接着我们看,除了反射type of可以拿到这个reflect type这个类型呢,还有一个非常重要的类型,各位同学就是它的value类型。啊,各位同学请看,那么还有一个它的核心的反射过来的东西叫value。那么这个家伙value,它又可以有哪些东西呢?它也是这样子获取到的各位同学,也就是说我,比如说对number吧,或者student,我都可以这样操作,我通过他调用它提供的另外一个。方法。啊,函数啊,不是不不是方法是函数。
11:00
好,我把它先复制一下,各位同学通过它的什么方法呢?哎,通过它一个叫value value of的一个函数,那么value函数我们来弄啊,看它是干什么的,打开我们的文档。打开我们的文档看一下,同学们可以看到在这里提供了一个value,注意这个是一个准确的讲是一个函数,它也可以接受任意的数据类型,并且返回一个VALUE6。同学们,那么看看这个Y6是什么东西呢一点。哦,这个value啊,它是一个什么样结构啊,各位同学注意听,有不一样的地方,刚才那个是什么结构,这个是什么呀?这个是个结构体,那么这个结构体里面包含了哪些方法呢?你看哦,往下一看,你会发现它包含了很多很多非常有用的方法,看这里,从这开始全是他的方法。呃呃不不不不是这啊这这是type的,从这开始,大家看从这开始。
12:02
一大坨,你看。全是他的方法。看全市,那也就是说我们如果拿到了他的这个,呃,Reflect value这个类型呢,我们就可以调用这些方法去做相应的工作,比如说判断什么什么有效没有判断是不是一个逆,通过他也可以拿到开。那就更有意思了,也就是说我如果拿到这个值,Reflect,这个呢,我还可以拿到CA,还可以拿到type呢,看到没有,也就说我通过这个value还可以拿到type,这个type又是什么呢?还是那个接口,你看又绕回去了。所以这方如果我不讲这个很不讲这个大概东西,你绝对停目圈,他一绕回去也就这两者,其实他们之间还有一个桥梁关系,那还有很多啊,比如说float,还有这个翻number field一看就是判断什么呀,如果是结构体,我就看你有多少个字段,看没有,你再比如说吧,同学们,这个看懂了吗?能猜出来是什么意思吗?
13:00
来张代你,你大概知道是什么意思吗?Failed by index。是不是通过一个索引来获取它的字段呢?它返回的又是一个value啊,它还可以通过名字来获取这个value,对不对,还有什么,你看哦,还有这些大家一猜哦,这个地方比较有意思了,你看它可以调用你的,调用你的方法,它还可以返回函数呢。哦,他返回你的方法了,看到没有,如果也就是说我我通过这个reflect。Reflect,这个value,这个这个类型可以返回来再获取到你这个变量对应的那个结构体的方法是哪个,而且这个方法呢,还可以反过来去通过考去调用。诶,有点意思了,大家可能有点感觉了,好,当然还有很多其他的信息,也就是说可以在这拿到大量的这个函数,好我把这个呢简单的捋一捋。好,捋一捋,这样当然是它大量的函数在这等着我们去调用了,哎,你看从这开始全是多的很啊,多的很好,那我就截了一部分。
14:06
OK。好,那么他们之间的就是这样的一个逻辑关系。甚至他们之间还可以产生一种关联,就是他拿到这个reflection过后呢,同样他也可以反过来利用这些方法反向去操作我们这个东西,这就叫反过来操作嘛,反射嘛,对吧,反射操过来,当然这两者之间以他们之间呢,也可以通过一个关联关系搞定,怎么关联呢?你看我如果说通过Y6的type又找到它了,说他们之间呢,还可以进行一个相互的什么呀,一个转换。哦,原来是这么一回事,那说白了我们学这个反射,我们学这个反射说白了就是学的什么呢?一堆这个东西,就是我们的变量怎么转换到type,然后又通过type怎么去操作它,或者说是通过这个变,这个变量怎么去拿到我的reflect value这这种类型,让通过通过他的这样一些呃,提供的方法呢,然后我又回反向去操作它。
15:12
就这个意思啊,就这个意思,所以反射是这样子的,那有些同学可能是会觉得很奇怪,说老师为什么他要提供这个东西呢?他提供这个东西有一个特别好的地方,有一个特别好的地方,就说他底层可以帮你去创建对象。他在底层可以帮你去做这个事情的,就说你不需要完全由程序员去做,打打个比方,我就举个最简单的例子,对吧,你给我,你给我提供一个呃,Student名字和agent,我在底层帮你去创建,然后再给你使用。甚至我还可以帮你去在反射调用方法啊,有些东也就就说有些工作,我可以在底层这个框架帮你去做很多事情,但这个事情呢,对用户来说可能就是透明的了啊,类似于这样一种感觉啊,好同学们,这个示意图我们要严重的把它拷贝过来。
16:02
好,同学们,我把刚才讲的这一个东西先给同学们板书到我们的笔记里面去。那刚才我们讲了什么玩意儿呢?就是反射的一个基本介绍,各位。好,我把它的一个原理给大家做了介绍啊来,这个是标题二,我做了五点说明对不对,五点说明基本介绍。好的,那首先呢,我们来了一个基本介绍,告诉他大家反射它具有的特性有这么几个。对,反射。啊,反射可以呃,动态的获取变量的各个信息,那这个小儿科了,对,拿到你的类型和类别小儿科对不对,如果是结构体呢,我还可以拿到你的字段呢,方法呀等等等等啊,那这样子的话,就可以把一些权限交给我底层的框架,再比如说通过反射我还可以去修改变量值,不跟玩似的吗?我我想我想在底层给你修改,我就给你修改了,对不对,好通过反射呢,使用反射有个前提,都要引入我们这个非常重要的包,叫reflect,好,还有一个就是刚才老师画的一个示意图,这个示意图对我们来说是一个指导意义啊,待会如果说大家感觉有点懵的时候,你就想想,诶韩老师刚才画了这么一个图,就不会觉得很很奇怪了,就是他们之间有时候不把这个关系搞懂,上来就讲你会怎么怎么又跑过去,又跑过来,也不知道是啥啊,也不知道是啥好。
17:30
这个示意图对我们来说很很重要,我把它呢给大家截取到笔记里面去,各位。好的。OK。这是我们讲的板式的一个示意图。保存到我们的笔记中去。好了,我们先把这个,呃,关于反射的基本介绍呢,我们先给大家说到这里。
我来说两句