00:00
哎,我们呢,今天主体来讲第15章叫Java的反射机制啊,Java的反射机制先说一下这一章的一个大体情况,这个反射的话呢,是Java呢,给我们提到提供一套新的API,使用这套API呢,我们可以做一些事情,能做什么事呢,我们一会具体来说,那这一章的话呢,有点难度,大家学起来会感觉稍微有点吃力,不像我们前面两个讲这个IO流,讲网络的时候呢,感觉这么轻松了,会有点难度啊,那么对大家要求的就是涉及到这个代码呢,你先要会写这个理解层面呢,慢慢来啊,有点难度,那同时的话呢,它难了,它还比较重要啊,这就恶心了是吧,不既难又重要啊,那所以呢,我们后续这个,呃,这个咱们在后续这个开发当中,这个你看一些框架啊,包括呢,你在看一些框架的底层源码,我们会看到很多位置呢,都在用反射,咱们自己呢,也可以主动的去用反。
01:00
所以这块呢,它还比较重要啊,所以对家大家的要求呢,就是在听的时候呢,你得你注意听了,这是一方面啊,另外呢,落地还是第一个层面,先会写代码,这个理解层面呢,慢慢来,还就这样啊。好,我们看始反射这一章,我们主要讲的哪些内容,这呢罗列了七个,第一个关于反射机制的一个概述,第二呢,反射里边提到一个源头,这个源头呢,就是我们说的class类,那关于class类的理解,以及呢,获取class类的实例,获取这个实例需要大家掌握在下一个关于类的加载和class的一个理解,这呢作为一个了解的内容啊,在下边创建运行实类的对象,这呢又需要大家掌握的一个内容,掌握的话呢,我给你标出来啊,这个需要掌握获取大的class实例,这个呢需要掌握,这都是落地的,这个代码在下边呢,就要获取运行池类的完整结构啊,这呢我就给大家写写代码演示演示不需要大家掌握,呃,已经知道的,就是我们通过反射的能够做这样的。
02:00
事儿就可以了,那真正开发中我们要做的话呢,基本上都是做的是第六个事儿,就是调用运行时类的指定结构,最后一个呢,叫反射的应用,叫动态代理,这个呢,大家,呃,暂时呢,你先作为一个了解啊,他呢其实也属于我们代理模式中的这个叫动态代理了啊,那在我们后边讲到像spring的时候,哎,我们会再讲动态代理这块呢,我们只是作为一个例子给大家引入,通过这个动态代理的例子,大家去体会一下我们所谓的反射的叫动态性。啊就可以了,这呢标红呢是大家落地代码需要能够熟链写的,后续我们要用的话呢,哎,都是用红色的这个代码极度啊极度OK,那首先呢,我们就关于这个反射呢进行一个概述了,好,我们这样的一段描述说反射,反射呢,这个对应的英文叫reflection,就是这个动词反射的意思,Ion呢,就是一个名词的说Java的reflection,就是Java的这个反射机制啊说呢,这个反射机制呢,被视为叫动态语言的关键反射机制,允许程序在执行期间,执行期就是我们Java c这个命令解释运行的时候啊,在执行期间呢,借助于反射提供的API,我们能够获取类的任啊获取任何类的内部信息。
03:26
并能够直接来操作任意对象的内幕属性和方法啊,那我们反正能做什么事,这上其实也已经说出来了,在运行的时候,我们可以通过反射来获取任何类的内部信息,并能够直接操作任意的对象的内部属性和方法。这个事呢,其实是在运行的时候才确定下来的,所以我们才把它称作叫做动态语言。啊,就是咱们Java程序呢,这不是分成两个过程嘛,先编译后运行啊,ID呢是在编译的时候,其实我们不能够确定下来,哎,你呢到底是要造,比如说哪个类的对象,只有运行的时候呢,我们才能够确定下来啊,我们把这种这个特性啊,就称作叫做动态的这种特性,那可能大家呢,还这个不太好理解啊,就是这个咱们要想理解清楚,那你还得看代码吧,那看代码的时候我们才知道,所以咱们讲到相关的代码的时候,我们再来强调一下,这个叫动态语言啊,那当然了,我这个PPT里边还专门补充了一个,大家呢去稍微理解一下叫动态语言和这个静态语言啊,什么叫动态语言,就在运行的时候呢,可以改变其内部结构的这样的啊,典型的呢,像这种解释性的语言啊,或者叫脚本语言啊,这呢都是属于叫动态语言,张二来讲呢,其实应该算是叫静态语言,静态语言啊,就是运营时呢,结构不可变了啊,就是我们说你编译的时候呢,这是什么样的,其实就已经确定下。
04:53
下来了啊,但是呢,我们这个把Java呢又称作叫准动态语言啊,能这样叫就是因为我们Java呢提供了一套反射机制,通过这个反射机制能够让这个Java上看似有这种动态的特性啊,啊我们可以在运行期间去决定到底造的是哪个类的对象,调用的是哪一个方法,在运行时候才定下来啊,这个事儿是反射来做的,那这个事呢,其实体现的就像是这种动态的特性,所以呢,我们才会把反射哎看作是咱们动态的这个关键,有了它Java呢才具有这种动态的这个特性。
05:30
行,我说完以后呢,还是很抽象,这个很正常啊,咱们通过代码的话呢,再让大家去体会,现在呢,你先知道这么个事啊,只要一到反射在Java里边,这个反射机制就是为了体现这种动态的特性,我们才提供的这一套语言啊行,那下边的话呢,我们提到这样一段话,说呢,加载完这个类以后,咱们呢,这个在java.exe这个命令执行的时候呢,我们就会去加载这个类了,加载完这个类以后呢,内存的这个方法区呢,说就会产生一个大的class的一个类的对象啊说这个对象呢,就包含了完整的类的结构信息,哎,我们呢,可以通过这个对象看到类的内部结构啊说呢,这个对象就像是一面镜子一样,通过这个镜子可以看到类的结构,所以我们形象的称之为反射,看这个能不能看得懂啊。
06:21
反射这个词大家最先接触到的,对应该是我们上中学的时候讲的这个光的反射啊,这个我们来温习一下啊,这是一束光是吧?哎,这个光打进来以后,这是入射光啊,打进来以后呢,是有一个还有个这个法则呢,还是吧,法线啊,对法线这个垂直的关系,然后这个入射角还有出射角是吧,是要出射角,反射角啊,这个出去的时候呢,这两个角度是一样的,这个呢就反射出去了,这呢我们就叫做光的反射,这是在物理上讲的,生物上其实也讲过,比如说细条反射。
07:00
是吧,哎,正常一个人这是你的这个四肢哈,哎,这个脑袋动他一下这块,其实这块这个胳膊就动了是吧?这是通过这出出发的哈,那膝掉反射,就你这块呢,膝了一下这个膝盖这个咱们有一个那个部位嘛,提一下以后,然后这块呢,这个神经立马就传绕回去,传绕回去这个传递到大脑,大脑立马又又反射回来,这个你你你你一敲这个腿的膝盖这个位置,它腿就自动噔翘了一下,是吧,这就是要膝跳反射啊,嗯,当然叫反射啊,那我们就以这个光的这个比如来举例哈,现在在我们Java层面呢,有一个结构呢,就有叫做反射了,哎什么意思呢?你看原来的时候咱们是先有一个包。在这个包下呢,我们声明了一个类,通过这个类呢,我们造了一个对象,是这样的一个过程,现在的话呢,我们通过这个对象,我就知道你这个对象是哪个类给你造的,找到了你所在的类,通过你所在的类的声明,我就又知道你是哪一个包下造的。
08:06
这呢就是我们所说的这个反射这样一个概念啊,这就反回去了吗?啊通过这个呢,大家体会一下哦,原来反射呢啊是这个意思哈,那咱们这块呢,讲的这个事,咱们接下来呢,写代码的话呢,就是主要体现的就是这样一个过程啊,这样一个过程啊。好,这呢就是我们说的这样的一个过程,哎,大家呢去体会一下,这呢我们提到这个动态的和静态的,大家做一个了解就行,那么接下来这呢,又提到了通过反射机制,到底我们能做什么事呢?哎,这呢我们说能够做这样的一些事情。啊,就是利用反射提供的相关API啊,可以做什么事,在运行的时候,咱们判断这个对象是谁造的,那那也就是他所属的类,然后呢,在运行的时候呢,我们可以去创建任何一个类的对象,可以判断一个类它到底有哪些结构,典型的就是属性和方法,那然后还可以获取你对应的这个泛型的一些信息,包括注解的一些信息啊都可以,那还可以呢,去调用任何一个对象的成员变量和方法。
09:15
啊,对象的啊,有了对象了,这个里边的这个实例变量和它的这个具体的方法还可以呢,诶去生成这种叫动态代理,这个在我们后边呢,这个框架当中,Spring里边呢,我们会重点讲解这个动态代理啊这呢是我们通过反射呢能够做的一些事情,那我们这章讲完以后,大家翻回来,你看一下我这里边写的这几个事儿,哎,你看看是不是我们都讲到了。啊,讲到以后你回过来再看这个文字呢,就更加的清晰啊,那么这里边儿呢,提到了说能做这样的一些事情,那要想做这些事情,那肯定得需要相关的API支持,那这呢,我们就提到在反射这一章当中,我们都提供了哪些API呢?哎,说有这样的一些。哎,这样的一些主体上呢,关于反射的API都在这样的一个浪包子包下定义的,就浪包下有一个reflect的子包,子包下呢定义了很多的结构,主体呢,是来操作反射的啊,那另外有一个类,我这标红了,它呢是在浪包下定义的,是Java点浪包下的一个class类。
10:20
这个类的话呢,大家可能第一次见的话会比较特别一些啊,这怎么还有一个类叫class,这不是关键字吗?是关键字吗?不是关键字不是都小写吗?哎,咱这个是个大写的啊,哎,大写的首先跟你这个小写的一点关系都没有。哎,Java的话呢,是严格区分大小写的,那另外的话呢,为什么非得是都叫这个名,毕竟咱们所谓的叫建名之意嘛,你这是个类了,类名不也算是一个标识符吗?那这个标识符的意思呢,就是说我用这个类来表示一个通用的一个类。有的人就懵了是吧,什么叫通用的一个类哈,你想想咱们造一个类,这个类叫person类,这个类呢,比如叫dog类啊,那类里边有具体些结构,咱们通过类呢去找对象,这是以前咱们讲面向对象不断强化的一个概念啊,那现在呢,说这个类啊,你这个,呃,你比如说咱们再再往下说,就是你多个对象,多个对象的话呢,每一个对象呢,都有名字,都有这个这个年龄等等,呃,这呢都是person类的对象,所以咱们在person类当中就呃通用的去定义了一些属性啊,内A值啊,包括一些方法,这些方法呢,这个属性,哎,对象呢也都有。
11:34
那现在的话呢,我们说你这个person类和这个道格类,包括其他的一些类,你们好像里边都有这个属性啊,都有方法,都有构造器啊,都有这么一些结构,这呢又像是一些共性了,那我就可以在它们的基础上呢,再抽象出来的一个类。这个类就叫做大的class类啊,就要这个类了,就放到这儿了啊,这个类呢,就是来通用的来描述啊,其他的这些类的信息的啊,就是这样的一个结构,相当于是这个person类也好,这个dog类也好,它呢这两个类又作为我们这个大的拉类的具体的实例了。
12:16
哎,作为这个具体事例了,也就说我们这个大的class就是用来描述类的类很抽象是吧?嗯,这个咱们还是先简单描述一下,不去深究,然后我们还是看代码具体什么样,然后呢,通过代码再返回来看这个文字,这个时候你才能够更清晰的去理解啊,成这儿呢,我们就不过多的去深究这个问题了啊,这儿呢,就是我们先简单的啊,对反射呢,大家有一个简单的了解,哎,还是有一定的抽象性的,这也是他这一章的难点所在啊,典型的一个就是关于大的class类的理解,这呢确实是一个难点啊。呃,先简单的有这样的一个印象先。
我来说两句