00:00
那关于我们讲的类的加载器啊,按说呢,咱们已经啊讲授完整个这样一个体系了啊,但是最后的话呢,我们再给大家补充一个内容,这个内容呢,叫做JAVA9的新特性,那我们知道呢,现在目前呢比较新的啊,这里可以14是吧,那这个到九暂按说呢,现在这个Oracle又该发布这里K15了啊,当然不知道是不是因为这个疫情的影响呢,然后现在呢就没有发布啊啊那这里边我们想说的问题是什么呢?咱们说现在在企业里边用的比较多的呢,是扎va巴,那咱们前面这个内容的讲解,注意不管是双性水派机制也好,还是咱们说这个类的加载器分类的这样的一个格局也好,注意都是针对于咱们说的扎VA8来讲的,那扎拉九呢,有一个很大的变化,这个变化呢,就是引入了叫模块化。那模块化的引入呢,直接导致我们类的加载这个体系呢,有一个比较大的一个变化,那这块呢,我们来给大家呢做一个讲解,那这呢就涉及到扎八九的一些新的特性,那看到这些新的特性呢,大家有的时候呢,会感觉哇,原来变化还是这么大的,那从我们日常开发的角度来讲呢,大家呢,可能体会不到啊一些变化是吧,但是呢,我们在底层类的加载的设计上来讲,确实变化还是比较大的。
01:16
比如呢,咱们刚才呢,在执行这个操作的时候呢,大家会看到这个具体结果的一个输出啊,我这呢就直接盯一下啊,哎,放在这儿这个结果的话呢,我们看到当前咱们使用的是自定义类的加载器,它的副类呢,是我们说longter内部定义的叫APP class loader,那咱们也提到过,不管是系统类加载器也好,还是我们说的扩展类加载器也好,都是在咱们这个叫launcher这个内部来定义的,对吧。啊,包括呢,他们俩呃,共同的还有一个呃负力加载器,我们称为它叫bootrap,称为它叫引导类加载器,好,那这个完了以后,大家注意,现在的话呢,我呢去新创建一个module,那这个module的话呢,我们这样来去命名。那这呢,我称为呢叫capital,这个还是在零四啊,这个我带一个下划线一行做一个finish。
02:07
啊,可以了是吧,然后这个结构呢,我们给它调整一下它的这个啊,识别的这个JDK的这个版本啊,它呢,在这块我们把它这个dependence啊,调整成这个九啊这个是九,那当然呢,如果自己电脑上没有九呢,你可以去下载一下,然后呢做一个安装就可以了,那这块我们也识别一下这个九的这个语法啊,这就可以行,那相当于呢,我们当前这个model呢,是使用的JDK9这样的一个环境。啊,这样一个环境,那这块呢,就呈现出来这个酒了,好,那接下来的话呢,我们在这里边注意啊,我写一个简单的代码呢,来进行一个测试啊,首先呢,我们就新创建一个包。好,这个报价呢,我现在呢,去创建一个类。哎,Class load的一个test行,然后在这里边呢,我写个main方法,针对于咱们当前这个class test这个类,第二那我呢,诶点class一下,看一下这个类呢,它的class load是谁。
03:04
那正常来讲的话呢,是不是就应该是我们说的叫这个系统类加载器,对吧?好我们执行一下。嗯,出来结果了,那大家会看到呢,这时候是不是仍然是新动力加期,那么对吧?哎,当然这时候呢,大家有没有发现我们所在的这个结构变了呢?不再是呢,咱们说的是launcher了,对吧?而是呢,改成叫class loads,注意有个S啊行,这呢是一个变化,那咱们接着再谈,这呢是咱们找到的叫做系统类加载器,那我现在呢,再去调一下叫get parent,那是不是就获取它的上层类的加载器,对吧?那按说的话应该是叫扩展类加载器了啊,但是呢,大家你会发现这时候呢,我们名字变了,叫做platform。啊,平台类加载器。看变化还是比较大的,那我们再接着呢,去往上层去找,再去get parent。啊,此时呢,我们再一执行。
04:00
好,大家发现呢,啊,再往上边找呢,我们又是个no,那压IG呢,我们这时候已经到了这个引导类加载器的位置了,对吧?好,那我们就暂时呢,先说到这儿,那通过这个呢,一个小的测试呢,大家会大家会发现呢,我们这里边儿这个变化呢,确实还是蛮大的。啊,确实还是蛮大的行,那么接着咱们这里边儿这个测试呢,咱们来看一看这个JAVA9中的这个新的变化啊,这个情况啊,这个我往下移啊,这个放上边吧。说为了保证兼容性,这个酒呢,没有从根本上呢去改变三层类加载的这个架构,以及呢叫双拼尾派模型,但是这个模型呢,实际上是有一些变化的,一会儿咱们说到说为了这个模块化系统的一个顺利运行啊,仍然发生一些值得注意的变化,那下边呢,我把这个变化呢,就总结为呢这样的五个点。好,那我们来一起看一看,那如果大家呢,在面试当中,这个面试官呢,提到了这个模块化的问题的话呢,那相应的我们上面讲解的一些内容啊,都相应的需要做一些变化,做一些改动啊,首先第一个扩展机制呢被移除,那这里边儿就提到了我们说扩展类。
05:06
扩展类加载器,由于呢向后兼容性的原因呢,被保留了,但是呢,这个名字呢,被重新命名为叫平台类加载器。啊,因为这呢就提到这个扩展啊,这个名字呢,已经不太适合了啊,已经不太适合了啊,这个我们还可以通过class loader呢叫get platform来直接进行获取,这个呢跟咱们之前呢,那也是有一些变化的,你像以前的时候呢,我们直接呢叫。这个什么呀,叫获取。啊,系统类加载器啊,直接呢,我们就class load。第二我们叫get system class就可以了,是吧,这个呢,就是咱们获取了一个叫系统类加载器,然后现在呢,我们说可以直接呢来获取叫平台类加载器啊,直接呢我们通过class loader。哎,第二我们就get platform order啊这样呢就可以了,来我们这块呢,做一个执行。
06:07
哎,大家发现了,你看确实呢,我们获取到了这个APP的,还有这个platform的对吧,哎,OK,行,那这呢,就我们说的,诶,多了一个相关的这个方法。啊,这是其一,那刚才呢,咱们提到了说这个为什么要保留这个结构呢?其实就是为了呃,还是保留原来的这样的三层架构啊,还是要保证三层这个架构,因为我们毕竟很多代码呢,都还是用原有的这个呃三层架构呢来写的是吧?哎,比如说你通过一个系统类加载器,你去get parent,那仍然应该得到的就是它的上层再get parent才到引导类了,所以这个三层的结构呢,咱们不能变,但是呢,这时候这个扩展呢,对于我们来讲意义已经不大了。那像这个我们提到的,比如说呢,我们这个扩展的话呢,呃,你像Java home这个lib ex这个目录下。啊,或者说我们通过这样的一个系统变量来表示的,就扩展的一些这个JA包,一些资金码文件,那我们呢,使用叫扩展类加载器去加载,但是现在呢,我们已经把这个Java的这个核心代码呢,呃,像RT.ja to点炸等等,把它们拆分成几十个节的文件了。
07:15
啊,这个时候呢,我们其实就没有所谓的这个扩展可言啊,当然你看我们这个八当中,是不是就是我们看到的一些这个炸包是吧,像RT点炸啊这呢,就我们说核心API里边存放呢,都在这里边,那在JDK9当中呢,我们就把它分成啊,一个一个的这样的,你像是叫目的啊节目的这样的一个格式了。啊,其实呢,就没有这种扩展的这个概念了啊,但是呢,为了我们像之前的代码兼容,咱们还保留了这个三层的一个这个类加载的一个架构模式啊,这个主意还保留一个架构模式了,而且这个双机派模型呢,其实从形式上来讲呢,也做了一个保留啊。好,那我们接着再往下看,这个平台类加载器和应用程序类加载器呢,都不再继承于ul classo了,那这个咱们在上边这块讲的时候呢,是不是都是继承于URL class是吧?那这个时候呢,我们看一下。
08:08
啊,他们两个,包括我们说的这个叫启动类加载器,都继承于这叫build in class。来我们这块呢,来做一个验证啊,那刚才呢,咱们看到了这两个哥们呢,是不是都是在我们class loads这个内部结构中定义的是吧?那我们这块呢,就可以去class loaders加个S。在这个内部当中啊,我们就能看到三个结构。对吧,Appo platformo booto,注意这时候叫booo了啊,首先呢,我们看一下他们各自的这个类。哎,你看叫build in class。然后下边这个to呢,也是building ino。那platform也是build in,所以呢,他们的这个负类呢,那都是这个叫build in class,而这个build in class呢,哎,咱们再往上看,它呢,是继承为叫secure class。
09:07
那这个结构呢,还是跟咱们原来说的一样,而它呢,是不是还集成于我们这个克拉so德是吧,那真长就清入这个结构了,好,那基于这个结构呢,我们说一下,如果呢,咱们在这个JDJ9或者是更高的版本当中,大家呢,像依赖啊,你比如说你自定义这个类的加载器,你使用的是集成于这个URL拉的这个方式呢,注意这时候就有问题了。是吧,这时候就有问题了,那如果你还是继承于这个class load的话呢,是没问题的啊,就别继承ul class load了。对吧,哎,注意这个问题,那么关于他们三个的这个负类呢,啊,是继承于他的,它呢又继承于他,它呢在继承于class啊这呢是一个层次关系。好,这个就明确,然后。大家呢,在我讲到现在的时候呢,你是不是会有一个疑问。啊,什么疑问呢,我们原来呢,在这个Java代码层面,你是不是不可能看到谁呀。
10:02
我们有一个类竟然叫引导类加载器啊。那原来呢,咱们说过这个引导类加载器,它是不是应该用C和C加加的这个代码去实现的吧。对吧,而现在呢,我们这个呃,引导类加载器,或者呢,也称为呢叫启动类加载器,它呢,呃是在咱们Java这个代码层面呢,有所体现了,那对应的呢,这个名字呢,改成叫boot class load德尔塔,它就是咱们说的这个引导类加载器。啊,它是我们的引导类假期,那使用了我们这个Java语言,当然这个也会涉及到我们这个底层在调用的时候呢,有一些native的一些实现,对吧?那但是呢,我们有Java对应的这个类库的一个支持了,啊只是说呢,我们在呃这个具体获取的时候呢,那跟原来一致,还是一个not值。哎,这个注意啊,还是一个not,那其实啊,我们配置相关的参数的话呢,也是可以获取到这样的一个具体的实例了啊,只不过没有必要这样去做啊好,这个呢,大家清楚这个事儿,那另外呢,就是多了一个方法啊,当然这是一个哎,比较小的一个点了。
11:08
比如说呢,上面我们通过这个啊,通过这个也好,或者你通过这个也好都行啊,我们呢,直接拿过来点啊,他们有个方法呢,就叫做get name啊,咱们可以直接拿到呢,当前这个类的加载器的一个名字。啊获取啊类的加载器的这个诶名称啊,相当于有这样一个对应的属性叫做name,该name呢,对于我们说的呃,系统类加载器来讲,它就叫APP了啊就是它啊,它对于我们说在这个程序调试过程当中啊,遇到的一些相关问题的时候呢,有一些帮助啊OK,这是说的它。那关于整个我们这个架构呢,还是理解成是三层啊,还是理解成是三层啊,跟这个原来呢变化不大,那还是主要考虑是向下兼容的问题啊,但是呢,这个时候你主要注意到我们整个这个Java类库的这个构建方式呢,已经完全变了,那基于这种方式的变化,实际上我们的双亲委派机制呢,也发生了一定的变化。
12:11
哎,也发生了一定的变化啊,这块大家注意一下这个问题,你看原来的时候呢,我们双清尾白机制呢,就是这样一个场景啊,就是呃,一直向上呢,去委派,那上面呢,加载了那就加载上面没加载呢,由我们这个下一层的这个类的加载量去进行加载,还不加载再往下走对吧。好,那么在咱们这个JDK9当中,实际上呢,这时候我们这个代码呢,就无所谓这个所谓的扩展这个功能了,那我们实际上是分成了不同的这个模块,那不同的模块呢,由不同的类的加载器呢去加载。你看由不同的类的加载器去加载,所以分子呢就非常的清晰,各司其职,所以这时候呢,我们就出现什么样的一个,呃,修订版的双性派模型呢,说呢在委派给负加载器加载之前。
13:00
咱们先判断一下你这个类呢,是不是归属于某一个系统模块。如果你要归属于这个系统模块呢,哎,我们就直接看一下你这个模块应该是由谁来加载的啊,比如说我们找的API相应的呢,它是存在于这个呃模块当中的,而这个模块呢,就是归你这个平台类加载器负责的,那我们直接呢,就由这个类的加载器去加载了。啊,相较于以前的话呢,它有一个变化。对吧,还相较以前的一个变化,那么这一点呢,大家呢,也做一个关注。好,那咱们上面讲了挺多内容,大家突然呢,说最后这么一点时间呢,讲的那些内容,把前面的很多内容呢,都做了一个颠覆是吧。啊,那这块呢,我们呃说呀,大家还是确实要关注到呃扎VA9的这样的一个变化信信息啊,在网上你看到很多的情况呢,呃都是基于咱们现在使用比较多的八这样一个场景下去实现的,那么如果大家呢,你后期使用到更新的GDP版本了啊,你尽量的是吧,要避开原来呢,我们在八当中跟九不同的那些操作。
14:04
啊,就像刚才说的继承于ul这个class是吧,这样的事情你就不要做了。啊好,那么至此的话呢,咱们关于这个类的加载器呢,咱们就说完了,那么类的加载器这一章完事之后呢,咱们整个关于这个中篇的内容呢,那也就告一段落。哎,中篇的主要内容呢,我们其实还是基于啊,我们说的这个,那自解码文件是吧?啊这我们回过来简单的来看一下我们这个图。啊,我们看一下。这个图吧,还是基于我们这个自检码文件,咱们谈的比较多,然后呢,再把咱们上篇当中没有呃细展开讲的类的加载,还有这个类的加载器啊,咱们做了一个更深入的一个讲解啊,中心呢,实际上是在这儿,那么上篇跟中篇合在一起,最终目的呢,咱们还是为了这个下篇是吧,来讲解我们更深入的什么呀,关于这个性能监控啊,性能优化这块呢,做一个整体的一个准备啊,这个呢是咱们夏天要讲解的内容啊,那么下边的话呢,呃,后边呢也会录出来,然后呢,诶及时的发放出来,好,那中篇呢,咱们就到这里啊,谢谢大家。
我来说两句