00:00
前面呢,咱们讲了类的加载的过程啊,分成三步,那下面呢,我们来看一下这个类的加载器啊,类的加载器呢,它分成了有几类,那我们整体来了解一下,说GM呢,支持两种类型的类加载器,分别为引导类加载器和自定义类加载器啊这呢是分成了两类啊,从这个概念上来讲的话呢,我们看到这有一个叫自定义啊,那一说到自定义的话呢,我们第一反应就是咱们程序自己来定义的加载器,那就成为自定义类加载器了。呃,那要这样来理解的话呢,你可能会有点疑惑,为什么呢?呃,因为多少大家对类的加载器呢应该有所了解,呃,典型的我们知道的应该有引导类加载器,这个呢我们叫扩展类加载器,下边呢,你叫做系统类加载器,或者叫呃,应用程序类加载器都可以,至少呢,大家应该知道这三个啊,下边的话呢,我们说还可以去自定义类的加载器,那如果要这样说的话呢,回过来你会发现这除了引导类加载器,自定义类加载器之外,那剩下的这个扩展类。
01:00
这和系统类往哪放呢,就迷糊了是吧,因为这样呢,我只写了说分成两类。这呢也是Java虚拟规范里边提到的啊,就是严格上来讲呢,就分成两类,那这两类刚才提到这问题,怎么去看待我们提到的扩展类和系统类呢?我们在这看啊,就是概念上来讲,我们会认为自定义呢,就是我们自定义的,但实际上不是这个炸va虚拟机呢,没有这么定义炸虚拟机,这样说说将所有派生与抽象类叫class loader啊,就是凡是直接或间接继承于这个类的加载器呢,都划归为自定义类加载器。嗯,都划为一为自定义类加载器,这样说的话呢,我们就有了着落了,像extension class load和system class,它们两个呢,都间接的继承了class loader。啊,那也就是说呢,下边也就是说我们要划分这个类,加压器的分类的话呢,它自己bootrap呢是一类,然后下边这所有呢是一类。
02:01
诶,这呢是Java逊尼规范官方提到的这个点,大家呢,明确一下,那我们还可以再看一下这个图。这个图呢,就比较清楚的标识了class load它的一个集成数的关系,我们会看到像as class load,还有这个APP class so,就分别对应的叫扩展类加载器和这个系统类加载器,它们两个呢,间接的继承了class so,所以呢,我们把它俩呢也认为啊是叫自定义类的加载器,那我们从这API层面看一下ctrl shift t,我们可以去搜一下啊,嗯,Extension class loader。哎,注意这个结构呢,它是在我们这个刚才也看到了啊,相应的这个结构下边的它是一个内部类啊。诶,在我们这个launcher内部,它是一个内部类行,那我们看到了这个叫EST class loader啊看到它了,这就是叫扩展类加载器,它继承了是URL class loader,这个我们选中它以后呢,两方面,一方面我们可以点一下这个F4,大家能够看到它的一个集成关系,间接的继承了class loader。
03:06
啊,这个class so呢,实际上是一个抽象类啊,我们要是自定义的话呢,咱自己定义的话呢,其实它里边有一些方法呢,是需要我们考虑重写的,行这样看也行,或者呢,我们还可以看一下这个programs这样的方式呢,去呈现一下它的一个结构也OK,那它是间接的继承了class load。行,这呢是我们说的这个它啊,然后呢,CTR shift t再来看一下,叫APP class loader也同样呢,是在我们刚才这个launcher的一个内部,他俩呢是一个并列关系,APP class order呢,也是继承ul class order f4间接的继承了class order是吧?嗯,所以呢,他们两个从Java虚尼规范上来讲呢,都属于自定义啊类的加载器,那这个呢,首先大家明确一下啊,嗯,这是这个事情。那么接下来我们想明确的一下呢,就是这几种类的加载器,它们之间的一种相互关系,你看我这写的非常明确,说这里的四者,这四者呢,把咱们用户自定义的也算进去,他们之间呢是一种包含关系。
04:14
不是上下层关系,因为上下层这个关系本身也比较虚啊,也不是,尤其我们想说明的是他们不是继承的关系。啊,这个不是继承关系,这个大家一定要清楚哈,我们可以这样来理解,就是这个类的加载器呢,我们这样看可以理解成它是具有这种等级制度的。对吧,哎,是等级制度的,这个等级跟等级之间呢,是你可以理解成是这种算上下级关系也行,但是你不能理解成它是一种继承关系。啊,咱们在这个人类社会当中也有这种等级啊,咱们国家一开始说封建社会分成这个君王,下边一些官僚是吧,这个还有一些普通老百姓等等,分成一些这个阶级,那现在的话呢,像典型的讲这个印度是吧,他的这个种姓制度啊,也分成了好多的等级,那其实呃,不管印度了哈,这个凡是人类社会呢,其实都有阶级是吧,你有阶级的话呢,这个世界其实就会存在一定的不平等性哈,嗯,好了,然后再回过来啊,就是我们看到呢,它是分成这两类,其实呢,我们一会讲你会发现呢,它的分类的标准还可以从另外一个角度来说,那就是bootrap class order呢,它是非Java语言编写的啊,是用这个C和C加语言来实现的,而我们下边的这些都是使用Java语言来实现的,你也看到了引导类也好,这个系统类也好,他们都是间接的集成了class loader,那这都是我们Java代码层面,咱们能够看到这个代码了,所以呢,你可以从这个角度呢,来再来理解一下我们刚才所谓的这个分类。
05:43
这的情况哈,然后呢,我们再通过一个简单的代码呢,大家来体会一下我们说的这几类类的加载器啊,我这呢,新建一个class,诶,我就叫做class load它的一个测试啊。好,这呢我写一个main方法,嗯,里边呢,我们先来,呃,叫获取。
06:07
系统给我们提供的最下层的叫做呃,系统类加载器啊,获取系统类加载器。诶,这呢,我们直接可以调这个叫class loader。诶,它呢,有一个叫get system class loader,那这呢,我们就能够获取一个系统类加载器。那我们来跑一下。行,没有问题,那这时候呢,我们就呃相当于是打印了这个系统类加载器对象的一个呃,就相当于它的一个引用了啊前面呢是它所表示的类型,后面呢,就是这个对象呢,它的一个具体的呃地址值啊是这样的情况,是我们这个launcher的一个内部类啊是这样的,好,然后呢,我们通过这个系统类加载器呢,诶获取其呃这个我们说上层是吧,这个上层的话呢,就是叫扩展类。
07:04
加载器。行,通过咱们刚才这个叫system的碟,我就get parent。这样呢,我们就获取了他的一个parent,这呢其实是,诶,我叫ET,诶class,诶,Loader。好打印一下。嗯,没有问题,你看这时候呢,我们打印的就是它的上层。这个呢,其实二者之间呢,我们说是一种这个包含的关系啊,Get parent方式呢,就获取它的上层,就像咱们说这个文件一样,诶,我是A目录下有一个B目录下的有一个C文件,呃,就是T格式的一个文件,然后这个C文件的话呢,我们get parent其实就获取到咱的上层B再往上层获取,就是获取到这儿了,我们不能说这个B跟C之间是一种继承关系,是吧,这也不合适啊,然后我们再试图的向上层来获取。
08:07
诶,再来获取它的上层,通过这个扩展类加载器点,诶,Get它的一个parent。嗯,试图呢去获取叫呃,Bootstrap。Class loader。哎,你看我刚才用这个词呢,叫仕途。这时候呢,我们会发现呢,咱们获取不到。你看你会发现你看获取不到是吧,这个时候呢,它就是一个闹。嗯,这个一会儿呢,咱们具体展开会说一下这个bootrap啊,为什么我们就获取不到了,行这个呢,先整体让大家有一个感受哈,然后的话呢,我们可以怎么着呢,简单再来体会一下,大家之前呢,呃,可能也多少了解过这个类的加载器了,所以我们再写个简单代码啊嗯,我们看一下对于呃用户自定义。类来讲,看看它的这个类加载器是谁。
09:04
用户自定义类来说。比如说咱们就是当前的class loader test,这是咱们自定义的一个类啊,它的,诶我们先获取它的这个大的class的实例啊,第2GET它的一个class loader。获取我们当前class test这个类是由哪个类的加载器加载的这个意思。哎,这我这就叫一个class了。行,打印一下看看这个效果。诶出来了,那出来以后呢,我们把它CTRLC粘出来。放到这当然你会发现呢,我们这个呢,就跟咱们上边这个呃,System class呢,这个地址是完全一样的,不管那个类型一样,对象这个都一样,相当于我们这个系统类加载器呢,就提供了一个它的实例,然后用它呢来加载咱们自定义的类啊,所以说对于用户自定义类来说,它呢是默认呢,我们说是呃使用叫系统类加载器呃进行加载,这是对于咱们自定义的这个类来讲的啊,那咱们再举一个Java里边的核心的API,那典型的比如我们用一下这个string来非常常用的一个类啊,字符串第2GET class load。
10:21
获取瑞那个类,它是由谁来加载的?打印一下来,我们看一下啊。行,那此时呢,我们这个运行结果呢,是一个no是吧,那这个no的话呢,我们跟上边匹配一下,发现呢,跟这个是一样的,也就当我们试图通过扩展类加载器获取它的上层呢,我们说叫哎获取不到,嗯叫引导类加载器。那我们现在呢,通过这个string呢,看看它是谁加载的,首先说string我们这样写肯定会加载到内存当中,这是毫无疑问的啊,不会说它不加载,那加载到以后呢,我们看看它是谁加载呢,发现获取不到,那间接的我们就证明了,咱们说这个此缀类,它是使用叫引导类加载器来进行加载的,那以此论为代表的呢,就是我们说系统的核心类库。
11:24
啊,系统的核心类库呢,都是使用这个叫阴道类加载器进行加载了啊,Java的。诶,核心类库都是,诶使用引导类加载器进行加载了,那你这里边所谓的核心类库,这包括什么范围呢?你就跟说一个公司的核心层是吧,那那核心层假设这个公司呢,有这个几千人甚至上万人,那你核心层主要指的是哪一个范围呢?那在Java这个层面呢,我们说涉及到API呢,那也非常多是吧?那你主要指的是哪些呢?呃,咱们一会儿呢,具体来看啊,在这呢,就是咱们把这个整体上关于呃系统给我们提供好的啊这个三类加载器呢,简单呢熟悉了一下,哎大家呢,有一个感觉啊,对于这个bootrap呢,大家知道我们是没办法获取到的啊举一个生活中的例子呢,嗯,就比如说像。
12:17
啊,这个不说古代了,现在也有哈,呃,像这个英国呀,等等一些国家,现在还有所谓的这个叫,呃,他除了首相之外呢,还有这女王是吧?那咱们就举个例子,比如说女王家他们有一个厨师啊,专门给女王这个呃做饭的一个厨师啊,很高级,她呢就好比是这个叫boostrap,那你呢,就是一个平头老百姓啊,是一个正常的自定义类,那您现在呢,想去调用一下,说boostrap,说你能不能帮我做顿饭啊,想这个找一下这个,嗯,这个大厨是吧,给女王做饭的这个大厨,那不好意思呢,你是没有办法联系到人家的,也就是说呢,我们的这个引导类加载器啊,非常的高端是吧,夹克型号这个高端啊,它呢只负责来加载Java的核心内库,那像你这种自定义类呢,人家鸟都不鸟,所以呢,你试图获取呢,也是获取不到的啊,另外一个角度呢,这个bootrap class so呢,它也是使用C和C加语言来编写的啊,这个我们也拿不到它的对象了,行,那这样的话呢,大家先对我们提到的这个类的。
13:17
加载器啊,先有一个比较宏观的一个感性的认识。
我来说两句