00:00
那下面呢,咱们具体来展开说一说这几个不同的类的加载器,那首先呢,我们来说一下,这个叫启动类加载器啊,我们也称为叫引导类加载器啊,Bootrap class load说这个类加载器呢,是由C和C加加语言来实现的,呃,这个刚才我们已经提到过这个事情啊呃,嵌套在GM的内部,或者换句话说呢,这个启动类加载器或者叫阴道类加载器,它就是我们GVM中的一部分。啊,它就是其中的一部分啊,然后它主要用来加载Java的核心类库,咱们刚才已经说到了,说什么叫核心类库呢?这里边提到我们安装的JDK啊,JDK在g lib下有一个RT点炸包啊,就是runtime啊点炸包还包括像resources等等这些路径下提供的API呢,我们都认为是核心类库。啊,用于提供Java自身需要的一些类啊,那这些核心类库呢,它们的加载就需要啊引导类加载器。哎,就需要我们的阴道里加载器啊,好,下一个呢,说并不继承字class loader没有负类加载器,嗯,这个肯定不继承了啊,咱们是用C加加实现的,你不可能说再去继承1JAVA的这个体系结构了啊,这个大家理解,然后呢,他来负责加载扩展类和应用类,呃应用程序类加载器,并指定为他们的负类加载器,诶你会发现呢,咱们扩展类加载器,应用这个程序类加载器,或者叫系统类加载器,咱们你看获取到的时候呢,它其实也是个对象,所以呢,它也算是一个呃对象的这样的一个结构,那你这个对象呢,对应的这个类,呃,也得需要加载它们两个,就是用咱们的引导类。
01:36
呃加载器进行加载的,所以他们两个也算是咱们的核心类库嘛,是吧,嗯这样子啊,然后呢,出于安全的考虑,说不RI呢,启动类加载器,它这个只加载这个包含这个包名叫Java或者叫Java X或者是sun开头的这样的一个文件,哎是这样一个情况啊,呃这呢就是咱们说的这个叫呃启动力加载器。啊,这呢,其实我们可以再提一提Java这个历史啊,咱知道这个Java呢,是由这个C或C加加加这个演变过来的啊,当年这个高斯林呢,这个是考虑到了C和C加的一些优良特性,然后同时呢,呃又去除了它的一些呃不好的方面,比如说C里边呢,提到这个这种指针函数是吧,其实还是有一定的难度的哈,所以呢,为了降低这个难度呢,呃就推出了Java这一门语言,其实Java呢,我们也可以看成叫诶C加加的一个减减版本是吧?诶可以这样来理解啊,这个C呢,在它的基础上具备在面向对象的一些特征啊,叫C加加plus plus是吧?诶那这个注意这个C加加跟这个c sharp是不是一家的啊,这个c sharp呢,是微软搞出来的这个景呢,呃,咱叫sharp了,其实他就想理解成是四个plus啊,看似呢,好像是C加加的一个升级版哈,呃,其实这个不太一致啊,那么咱们可以把Java呢,看成是C加加的一个这个降低的一个版本是吧?呃,比如说。
03:00
C加加里边支持这个多继承,那在咱们Java里边呢,只支持这个单继承啊,当然呢,我们不得不说呢,这个C加加呢,其实它在底层设计上呢,其实更加的高效一些,这个大家也清楚,当然跟这个底层操作系统这个编程相关的,我们还是考虑到C和C加啊,但是呢,现在随着这个硬件技术的一个提升,呃,就是不是在这种嵌入式的设备了啊,这种在我们大型这个设备当中,随着这个硬件技术的发展,硬件价格的降低,实际上呢,Java呢,现在的一个执行效率呢,跟呃C呢是这个有一拼的啊,是这样一个情况啊。但是呢,在最初的时候,我们这个内的加载器啊,Java的这个启动类加载器,它还是用这个C语言来编写的啊,这个大家稍微关注一下啊,然后我们来看下一个啊,这也是我们虚拟自带的加载器啊,叫做诶扩展类加载器,刚才我们已经提到过了啊,Exceion class so啊这个我们在打印的时候呢,它是有一个简写啊ext,诶拉O。啊,这个我们称为呢叫诶扩展类加载器啊扩展类加载器呢,注意它呢已经是使用Java语言来编写了,因为刚才那会儿我们也看到了,它是呃间接的继承于class loader的,是我们这个Java体系里的,呃,它呢是在我们这个launcher的一个内部类这样的方式来实现的,它的负类加载器呢,是我们的启动类加载器啊已经说过了,它加载的目录主要呢,就是我们GRE,呃live下有一个ES器这样的一个子目录啊,是这样加载的,那下边有一句话大家注意一下,说如果用户创建的炸R文件啊,或者炸包里边的你这个class文件啊,放在了我们指定的这个目录下,那么我们说呢,呃,这个你自己定义的这些JA包中的class呢,也可以由我们的扩展类加载器进行加载,哎,也就是说呢,我们扩展类加载器呢,它就主要识别这样的一个目录。
04:50
啊,主要识别这样录啊,它就是来加载咱们核心包之外的那些扩展类的那些包啊,是这样个情况啊,嗯,这是我们说的这个叫扩展类加载器。
05:01
然后下边呢,还有应用程序类加载器,呃,我们也称为呢,叫做系统类加载器啊,那这呢,也自然而然的是用Java语言编写的,然后呢,也是在我们这个long内部呢,呃,有一个实现是一个内部类啊APP class loader派生于class loader不多说了,它的负类加载器呢,是扩展类加载器,OK,负责加载呢是class pass,也就是说咱们自定义的这个,呃,这些类啊,它生成的一个路径啊,叫class pass。或者呢,是我们系统属性java.class.pass呃,指定路径下的一个这个类库,咱们写的程序中的这个呃类啊,默认呢,都是使用这个系统类加载器或者叫应用程序类加载器呢进行加载的,呃,我们可以通过class loader.get system class loader这样方式呢来获取这个咱们刚才也演示过了,哎,这是这样的情况啊,行,那咱们这块呢,再来看一个代码啊,大家对我们的这个引导类和扩展类呢,有一个更清晰的一个认识啊好,大家来看。
06:04
我是这样写的,诶关于这个启动类加载器呢,我们获取的这个launchter,然后get bootrap class pass,我们来看一下啊,这个我们方法调用它的一个目的是什么呢?就是获取,诶获取什么呢?咱们叫诶bootstrap,虽然说呢,咱们这个bootstrap本身加载器呢,咱们拿不到。但是我们能知道它到底能够加载哪些路径下的这个大文件,或者说叫class文件是吧?获取boottrap class so,啊,能够加载的。啊,这个API的路径。诶,这个路径呢叫get us,诶是一个数组,然后我们做一个遍历啊,是这样个情况啊,下边咱们暂时呢,先注释掉啊先不管行跑一下。哎,这呢,就出来了。就是呃,Bootrap class呢,一共能够加载这些路径下的一些文件,哎,这文件里边我们说存放的都是class文件了哈,诶刚才我们也提到了,说这个RT点这,Resources点这,哎,就是这个意思,那我们在这个像咱们之前说的这个string大家应该很清楚啊,String就是在我们这RT点炸包下,嗯,这个不多说了。
07:19
那除了这些我们常见的比较熟悉的,像下边这些呢,也是啊,那举个例子,比如说呃,我们这有一个这样的一个扎包GRE的立下,咱们去找一下这个路径啊。嗯,先来看一下,我当前这个程序跑的话呢,我是在JDK1.8下跑的,或者8.0也行,找到我们JDK的位置。好,就是这个啊,然后在它下边的这个GRE下有一个lib lib下呢,它能加载这些路径,咱们找一下这个JS啊勾。那就它那这个jar文件呢,它里边存放的都是class class这个文件了,我们把它呢,比如说解压一下。
08:04
好,那解压完以后呢,我们再打开一下啊,打开以后呢,我们找一下这个具体的一个路径。啊,这个路径还挺深的啊,行,那不妨呢,咱们就来看一下这个自建码文件,它所对应的这个类叫provider.class好,那我们就在这里边来演示一下啊。Get class order。行,这个我们导了一下包,然后呢,再获取一个它的实例,打印一下我们当前这个class loader,看看是谁跑一下。行,看到了这时候呢,我们打印的结果是no,通过刚才呢,我们上一个例子呢,大家看到凡是你获取是no呢,表明它的,呃,这个加载器呢,就是我们的引导类加载器,来看它加载器是是什么呢?我们说是啊引导类加载器OK,没问题啊好这呢我们就说过这个问题了,然后呢,咱们来看一下这个下边的这个情况。
09:09
下面这个题目呢,我们来关注一下这个扩展类加载器,然后我通过这样的一个方式啊,Get property property啊然后呢,能够找到咱们这个扩展类加载器,它能够加载的这个路径都有哪些,诶加载路径都有哪些,来跑一下先。嗯,能看到有两个,一个呢是我们当前的GRE live下有一个E啊,这属于扩展类的啊,然后再一个是我们这个C盘指定的这个目录下的,那我们就以系统提供好的这个lib下的EST,以它为例。嗯,Jre lib e这个路径下呢,这些炸包中的class文件都由引导类加载器进行加载,再举一个例子,比如说就它吧,我们把它呢也进行一个解压。好,接下来以后呢,打开。
10:01
嗯,可以这打开了,打开以后呢,咱们找一个类啊。嗯,找一个这个类看着稍微短一点的,比如说这个QDB啊。行,那我们再来跑一下。嗯,大家看这时候呢,我们获取到的这个,呃,客户DB它的加载器呢,就是叫E,也是我们说的这个扩展类加载器。那那也就是说呢,确实呢,在刚才看到的这个路径下,它的这些API呢,是由我们的扩展类加载器来加载的,当然我们说句话呢,有点不严密,我们只是演示了其中的一个,嗯,这个你要想说都是,那你得把每一个都演示了,真的我就不做这样的工作了啊,那其实大家也显而易见,我们在指定的这个路径下呢,它都是由我们的诶扩展类加载器进行加载的,行,那通过刚才这个代码演示呢,就更加能够验证,诶刚才咱们说的这样的几个内容啊,嗯,再简单总结一下,大家需要记住的就是道类加载器呢,我们获取不到啊,不能够直接获取到,然后它是用C和C加语言来编写的,那扩展类应用程序类,包括咱们说用户自定义类,都是咱们用Java语言所编写的,他们有一个,呃,是这个get parentent这种包含关系啊,不是继承的关系,然后以及呢,什么样的类加载器来加载什么样的这个类文件,这个大家呢要清楚好这呢就是我们诶给大家演示的这个问题。
我来说两句