00:00
大家好,我是海波老师,咱们继续来讲Java语法中的反射啊,前面咱们讲到了类的自解码文件啊,它会在Java虚拟机运行时被加载执行,对吧?那么这里的加载执行呢,其实使用的是Java虚拟机内部的一个叫做类加载器的组件,那这里呢,我们来看看啊,来咱把这个呢,我们拷贝一下,拷贝以后把这个呢,我们二,然后后面再加上我们下划线啊,咱们下划线咱们叫class loader,这个就表示类加载器,点击OK,点击OK以后把里面的东西咱们全去掉,咱不要了啊,全去掉。然后呢,把这个呢,咱们也都去掉。好了,然后把这个名字啊,我改改啊,咱们叫做二啊,然后呢,我们的reflect。咱们的reflect啊,然后呢,我们的这个叫class load好了,写完了以后呢,我们在这里呢,就写上啊,咱们的todo,我们写上反射,然后呢,我们叫类加载器好了。那么一听这个名字啊,这个类加载器啊,它就是专门用于加载类的,对吧,那不用说了,我们叫加载类对吧,那么你加载类的话,我们这里就需要给大家讲一下咱们Java中的这个类啊,主要分为三种。
01:07
咱们Java中的这个类啊,它主要啊分为我们的三种,那么哪三种呢?我们写上一个一第一种啊,就是我们的Java的核心类库中的类了啊,咱们想Java咱们叫核心。啊,类库中的类,比方说我们的什么菌走说对吧,或者呢,我们那个object,所有类的负类,那个object对不对,那这就属于核心类库中的类啊,哎,就这个道理,那这是第一种,那么第二种呢,就是我们Java虚拟机,它的软件平台啊,咱们的开发厂商啊,他们自己呢,会有一些累啊,那么咱们之前讲过啊,咱们的gbm啊,它就是Java虚拟机的意思,它定义的一种抽象计算机执行指令的规范,那不同的开发厂商呢,就会有不同的实现,那比如Oracle啊,HP还有IBM,它都有自己品牌的加入虚拟机,咱们用的呢,就是Oracle的那个hot spot。
02:03
这个呢,咱们可以看一眼啊,在我们的命令行窗口当中,我们写上一个加嘛,写上一个沃son回车,回车以后大家可以发现咱们这个地方不就是我们的hot spot吗?这个就是我们Oracle啊,它的一个Java逊机品牌就是这个意思,所以呢,我们说了嘛,不同的品牌,他们的Java机都有自己平台的那些类,所以这就是我们的第二种啊分类了,那么接下来呢,我们说第三种啊,第三种就比较简单了啊,第三种我们自己啊写的类,比如我们的UR对吧,比方说我们的child,呃,咱们自己写的类,它就属于我们的什么,我们的第三种。那为什么要给它分这三种类呢?是因为啊,我们的三种类,它在使用的过程当中,它会有三种不同的类加载器加载,所以咱们这里写上一下咱们加法当中的我们的类啊,咱们的加载器它也有三种啊,咱们也有我们的三种。好了,那咱们可以通过啊,咱们的一个类,咱们看一看这个类的名字啊,我们叫class,咱们的loader,诶我们写上一个S,这里呢,我们去点进去,点进去以后呢,我们这里看左边有一个叫结构,就是这个类的结构,这是我们Java中的源码啊,咱们打开,打开以后大家会发现我们这里的有三个class,叫做boot classer,第二个叫class,第三个叫APP class,这三个class恰恰呢,就是我们这里所提到的这个类加载期,所以啊,咱们咱们这里写上第一个。
03:31
咱们叫boot啊,Class class好,第二个我们写上它叫做platform。咱们叫platform,第三个我们就叫做APP。啊,这就是我们三个不同的类加载器,那么我们的第一个类加载器,我们说了,它叫bud class loader,它叫什么呢?它叫启动类加载器,叫启动类加载器,那顾名思义啊,它会在启动,诶,我写错了啊,加载器类加载器啊,那么我们在启动Java虚拟机的时候,它就可以加载类,而加载的其实就是我们的核心类库啊,就是把这个什么string呢,什么object呢,给它加载进来,这是我的第一个。
04:10
那第二个是什么呢?第二个就是我们的平台,大家看一下叫platform,咱们叫平台嘛,所以呢,我们叫平台类加载器啊加载器,那么它加载什么呢?诶巧了,它加载的就是我们软件平台开发商他们所提供的类,那好了,那么这个叫APP class loader APP就是application的意思,所以它表示呢,叫应用类加载器啊加载器就是这个意思啊好了,这个呢,我们就给大家去说到这里啊,三种不同的类,三种不同的类加载器,但是呀,光这么说是不够直观的,所以呢,咱们演示一下来,咱们现在看一看,我现在呢准备呢,在咱们这儿我创建一个类啊,咱们这个类呢,别跟之前重名了,咱们就叫换一个吧,咱们叫student学生好不好,诶咱们换一个,那我换完了一个以后呢,我们在main方法当中啊,咱们得到咱们类的信息,所以写上它咱们要获取类的信息好了。
05:04
那我写完之后,我怎么获取呢?咱们以前是new这个对象,现在咱不拗了,咱们直接写叫student,点一下咱们叫class。我们有这样的一个操作,可以直接得到这个类的对象,所以我们点一下VR回车,你现在呢,就等同于直接把咱们当前的这个student类的信息就取到了。那么你取到了以后有什么用呢?诶,我就想知道它是由谁加载到我们当前的什么我们虚拟机当中去的,所以我就想得到它的类加载器,那这个能不能得到呢?是可以的,所以我们写上它叫获取我们类的加载器,类的加载器对象,那所以啊把它咱们拷贝一下,拷贝之后呢,我们这里写上一个点,我们叫get class loader,诶有没有发现我这里不就取到了吗?好,取到以后呢,我们来VR回车,回车以后呢,我这边就有了,行,那我啥也不干啊,咱们直接去打印一下,好,我点击右键咱们执行一下。
06:02
执行以后大家会发现我们这里啊,它就是一个什么内部类吧,那么这里叫APP class loader,这个不就是咱们前面讲的叫应用类加载器吗?诶老师为什么是它,那当然了,咱们这个student是不是我们自己写的类啊,没错吧,你自己写的类,那不就是我们的应用类加载吗?诶,那如果咱们把这个换一下呢,咱们口碑我换一下以后大家看一下,我把这个名字我改改啊,咱们叫做string。然后呢,我把这个呢,我改一下,咱们叫做string,然后呢,咱们都改一下,咱们统一咱们都改一下,好把这个呢,我们放到这边,诶这个我写上一个class loader1把这个呢放过来,放过来以后我们现在运行一下,咱们看结果,那这时候呢,你就会发现我们当前的这个地方为那老师不对。你刚才不说了吗?咱们的这个叫做Java中的核心类库中有字符串,而它如果想运行的话,它应该被我们的boot class load,就是启动类加载去加里,对不对?但是为什么打印的结果是个nu呢?这里呢就要解释一下了,因为Java的核心类啊,它加载完了以后,Java的完整语言体系才能使用,就好比啊,你自己写了一个student类,你要想能够运行的情况下,你必须要保证什么字符串啊,什么object这些类才能使用,对不对?诶,同样道理,咱们的这个object这个类啊,如果想使用的话,它里面有什么图使菌方法对不对?那么它的字符串类也应该加载完成,可是他们都是Java的核心类库,那你说这个如何保证它们的加载顺序呢?你是先加载我们的object,还是先加载我们的string呢?如果你加载我们的object,可是那个object里面有to string方法,那么string就需要提前加载,可是如果你加载使string的话,那么我们的object是所有类的类,那么你的使string的类也是object,是不是也应该先加载object呀?诶,你。
07:50
看看那这样的话不就有冲突了吗?对不对,所以啊,咱们启动类加载器它真正在用的时候是不能使用Java语言实现的,而是采用操作系统的平台语言实现,所以它打印出来的才是跟当这里给大家解释一下啊,所以呢,我们的启动类加载器它加载时啊,加载我们类时。
08:11
它采用什么呢?我们叫操作系统,咱们叫操作系统的什么平台语言实现,哎这里呢,给大家稍微解释一下,你像其他的这些,哎,就没什么事了啊好,那行了,那么我们的启动类加载器给大家说了,我们的应用类加载器给大家讲了,那么这个平台类加载器我们怎么得到它呢?这里给大家也解释一下,从加载的功能的角度来讲,我们一般情况下是什么呢?先加载啊,记住我们有一个顺序,我们的一啊,别移了,我们叫什么呢?叫做加载。我们的Java的什么核心类库?然后呢,我们再去加载什么呢?我们的平台内库,咱们的平台内库,然后再加载我们自己的类,所以呢,这有一个加载的顺序在里面,那么咱们简单的理解为我们的扩展类库,它应该什么呢?是我们自己类的那个加载器的上一级类加载器,也就是说它有个上一级的概念,所以呢,我们这里如果想要获取它的话,其实我们通过它应该是能够得到的,大家可以看到我们在当前的这个位置,不就已经得到了我们当前的这个叫应用类加载器吗?所以呢,我把这里复制一下,我们这里有一个点,它里面有一个叫get parent,这个parent就是当前这个类加载器的什么上一级,诶,咱们看一看运行。
09:29
运行以后你观察一下,你就会发现在咱们的APP的class load的上一级就叫platform平台类加载器,诶老师,那照你这么说的话,咱们的这个启动类加载器,那是不是平台类加载器的上一级呢?咱们再试一试,来把这个地方我们写上点叫get parent来咱们试一试啊,咱们运行。运行以后大家会发现我们现在打印的结果是什么,那诶你看看这个打印的结果跟我刚才的这个打印结果不都是当吗?所以啊,咱们前面讲的这个是没有问题的,好吧,行了,我们把这个类加载器的这个概念呢,就给大家介绍到这儿。
我来说两句