00:00
好,那接下来啊,咱们就给大家呢,在复习一下,咱们在上篇当中提到过的叫类的加载器,所以这节呢,主要是一个复习那类的加载器的话呢,咱们在网上啊,或者大家在平时的这个接触过程当中,那通常呢,我们会看到相关的一些图示,类似于我这个图的,对吧,那在这个图示当中呢,我们就能看到说内在加载器呢,似乎呢,是分成这样的几个类别。啊,没有问题,我们称为呢,叫启动类加载器,扩展类加载器,应用程序类加载器,包括呢,还有用户自定义的加载器,对吧?但是呢,我们通常情况下呢,按照GM的官方规范上来讲,一般呢,咱们把这个类的加载器呢,首先呢,先分成两类。一类呢,我们称为呢,叫引导类加载器busrip class order,那或者我们也称为呢,叫启动类加载器,说的呢,都是它叫busrip class order,那除了这个启动类加载器之外呢,剩下的这几个。扩展类加载器,应用程序类加载器,包括用户自定义的加载器,咱们呢,都统称为呢,叫自定义的类的加载器。
01:00
哎,都统称为叫自定义了,那有同学可能会想说,对于我们开发人员来说,咱们在使这个这个开发的过程当中,关于扩展类加载器和应用程序类加载器我们也没有写啊,这不也是这个Java给我们提供的这个核心API里边的其中两个给现成的嘛,那怎么叫自定义呢?对吧?所以这里边儿呢,我们主要指的是什么呢?就是凡是用Java语言实现的,然后呢,都继承于class loader这个抽象类的,这些类的加载器啊,咱们都成为呢叫自定义了。只不过呢,这些呢,相当于是这个JDK的开发人员他们来定义的,对吧,那他们来定义的那这块呢,大家注意,那也就是说呢,我们下边框住的这几个,他们的共同特征是什么呢?就是都是用Java语言来实现的,上边这个呢,咱们前面也提到过,是不是用这个CC加加语言来实现的,对吧?OK,行,那下边呢,我们就统称为这个呢,叫做自定义的类的加载器。好,那么在这个图示当中呢,我们会看到一个场景,就是说似乎满足我们Java继承的这样的一个层次,好像说呢,下边这个类的加载器,它的父类呢,就是上边这个加载器,而且呢,我们在这个语言上呢,也确实呢,就是这样叫的,比如说哎,应用程序类加载器,我们get parent,说获取它的副类,那我们就能拿到呢,叫扩展类加压器,扩展类加载器呢,也可以调用get parent。
02:20
那只不过呢,这时候我们调用这个关于不trap class order呢,我们只能是返回一个not纸,对吧,那一会我们可以再复习一下这个not的一个情况,总之的话呢,我们都习惯上把上一层看作是下一层的,这个叫负类加载器。你看我这块这个父类呢,加了一个引号,就是它不是我们严格意义上讲的那个父类,就是我们Java层面的那个父类呢,主要指的是继承关系子父,对吧?啊是这样子的,那包括呢,用户自定义的类的加载器,它的这个父类加载器呢,叫做诶application叫系统类或者应用程序类加载器,但是呢,这里边这个子父并不是咱们所谓的继承关系,而只是一种叫做包含的关系。
03:00
OK吧,只是一种叫做包含的关系,在下层的加载器当中,包含着上层加载器的一个引用啊,什么意思呢,就是从代码上,我这块呢,写一个简单的一个一个一个图示啊,就呃一个一个代码的一个演示就可以了,比如说呢,现在我们有一个呢,叫做parent。Class。OK,这样就是我们所谓的叫这个复类加载器,对吧,然后呢,我们再定义一个class,比如说叫一个child。嗯,Child class。嗯,这个child,注意他一定不是说extend了我们的parent class,那这就成了真正意义上的一个继承,对吧,咱说了不是这样子的,而是呢,在我们这个所谓的子类的这个加载器当中,它声明了一个叫做class loader,然后它呢也是一个parent,而这个。啊,这个属性是吧,这个parent呢,它的实例化的时候,比如我这块写一个public。啊,我们在提供当前你这个子类的构造器的时候呢,我们写一个参数。
04:04
这个参数呢,就写一个叫class parent,然后在这里边。哎,这不就我们平时写的这个构造器嘛,对吧,我们可以写一个呢,叫做,哎,这次点part等于。Current,对吧?当我们去创建一个子类加载器的对象的时候呢,我们需要传一个参数,而这个参数呢,我们就拿。嗯,拿咱们上边new的这个current这个呢去充当。那CTRL一下。哎,这样子是吧,言外这呢,就是我们这个parent所谓的负类加载器,只是作为咱们子类加载器中的一个属性,这样进行的一个赋值啊,是这个意思。OK啊,这个呢,就是我们所谓的这种包含的意思啊,那它呢,就称为呢,叫做负力加压器。嗯,是这样子的,而这个事实上呢,就是当我们这个下边不是还要讲关于这个克拉苏的这个源码,对吧?那大家真正如果去看源码的话呢,你会发现呢,那我刚才写的这个逻辑呢,其实不是严格这样来定义的啊,就是你看这个parent的话呢,我们这个呢,叫子是吧,相较于它呢,叫做子,那你这个呢,比如我们这儿呢,是这个应用程序类加载器,这个呢,属于这叫诶扩展类加载器,对吧,你扩展类加载器它是不是也应该有一个属性,也叫做parent,对吧?那我们这也去定义,那岂不是有点繁琐了,那真正实实际上实施的时候呢,是这样子的。
05:28
大家呢,会发现在咱们这个,呃,这个parent的这样一个属性是定义在咱们就是这个抽象类class loader这个里边。实际上呢,是定义在这儿的,我把这个代码呢,这个我CTRLC一下我粘到这儿。那我粘到这儿,然后这个位置呢,那这个构造器呢,就是一个叫class load了,对吧,那实际上呢,是这样一个场景,然后具体呢,你该去给谁赋值,那就给谁赋值了,然后在我们这里边的话呢,你就各自提供你各自的构造器就完了,比如我们这写一个public叫做parent class。
06:06
这样是吧,然后呢,哎,这个也有参数。哎,CTRLCL一下。那只不过在这里边儿呢,我们就直接调一个叫做a super。Parent这样就可以了,是吧,那我们这个呢,构造器,那这个这个加载器,我们让它呢,都是集成于叫做诶拉。那这样子是吧,呃,这个呢,实际上是我们真正设计的一个方式。啊,不管呢,是哪种,咱们说的所谓的自定义的类的加驶器,那他们呢,都是继承于class load的,那既然继承于class so呢,就没有必要在他们自己这里边儿呢去声明这个属性了,对吧,那你只是要呢写你自己的构造器,然后构造器这里边儿呢,我们再直接呢调用这个super。哎,这个parent,那这样就可以了。对吧,但是从形式上来看呢,大家知道也是满足刚才我说的那个就是我们实际上呢,是在你当前这个类里边呢,是不是有一个属性啊,只不过这些属性呢,因为每一层的类的加载器都要考虑他们的负类加载器,所以我们把这个属性呢,就提到他们的共同的负类当中来,这样来进行的一个设计。
07:13
OK,能理解是吧,好这呢就先明确一下,我们所谓的这种子父,它到底是一种什么关系,那这个大家要清楚,好,那下边的话呢,咱们就具体展开来说明一下,咱们讲到的引导类,扩展类,系统类,包括用户自定义类的加载器。
我来说两句