00:00
然后呢,我们说一下谁呢说叫类的加载器,我们把这个类呢加载到内存当中,谁来做的这个事儿啊,是类的加载器帮我们做的,这呢我简单放了一个图,这呢是一个Java的源文件,现在叫Java编译器啊,通过我们这个Java c这样一个命令生成的自解码文件,可能会有多个,一个解码文件对应着我们一个Java中的类,然后我们通过这个java.exe命令啊,我们就是把这个。磁解码文件对应的这个类呢,加载到内存当中,这呢出现了叫类的加载器啊,也叫做类的装载器都可以,还有这个磁解码的交验器,解释器等等啊,后期呢,再在我们这个操作系统当中呢,去执行啊,分配内存空间啊,去做运算等等,就是这样的一个宏观过程啊,那这里边我们主要关注的就是这个叫类的加载器,就这啊。那内台加载器的一个作用,刚才咱们其实也已经提到过了,说呢将这个class文件呢,Class文件的一个四解码。
01:00
然后呢,加载到内存当中啊,并将这些静态数据呢,转换成方法区中的运行时数据结构,相当于我们这个运,这个运行实例本身是存放在我们这个方法区的啊哎,这个时候呢,会生成一个大的class的一个实例,或者它呢就是我们大的class的实例啊哎,作为我们这个方法区类数据的一个访问入口啊,类缓存我们也提到了啊,咱们呢,在讲这个获取大的class实例的时候呢,不管是哪种方式发现呢,都是同一个啊这呢就提到了,我们就加载了这一次啊这呢我们就提到一个缓存的一个意思说标准的张SE的类的加载器可以按照要求呢去查找类,但一旦呢,某个类被加载到类的加载器当中了,它将呢维持一段时间啊,相当于给它缓存起来了,那维持在这段时间之内,凡是你要用到这个类的啊,都是唯一存在的这个类啊,也就是我们CLASS1234,我们发现呢,他们都是等等的这样一个情况啊,那么我们这个运。
02:01
十类呢,也是可以被Java虚拟机进行垃圾回收的啊,它呢也是一个大的class实例嘛,只要是对象那就有可能被回收啊,那你在回收之前它永远只存在这一份,好,这是这个事情,那接下来的话呢,我们来了解一下,这个叫class loader啊嗯,Class loader呢,就是我们所说的Li加载器啊,它的主要作用呢,就负责把这个类呢装载到内存当中的,那么障va虚拟呢,规范了如下这样一些类型的加载器。那我们了解一下啊,这个内在加载器最上边这一层叫boot strap啊,Class loader这个呢叫引导类加载器。接着啊叫啊extension class loader扩展类加载器,System class loader系统类加载器,那说呢,我们还可以去自定义类的加载器。那有这样的几个层面,那几个层面的话呢,我们提到了class loader呢,就是用来装载对象的,呃,装载类的。
03:00
那装载类,那不同的这个class loader是装载类有什么区别呢?这提到了就是它们装载不同的类,比如说像这个引导类加载器,它呢是用C加加编写的啊,是Java虚拟自带的一个加载器,它主要负责我们Java平台的核心库的一个加载。比如说咱们这个天天用string string呢,这就算我们Java提供的一个核心的一个类,这个string这个类我们要想在内存中去用,它也需要去加载,那谁帮我们加载的,就是它引导类加载器加载的啊,但是这个呢,你注意这个加载器呢,是没办法咱们直接获取的啊,就是你相当于想说我这个类加载器你是加载string的,你用C加加编写的,那是不是效率比较高呢?那干脆我自己定一个类叫person,你帮我加载吧,说很遗憾不行,因为这个加载器我们根本根本呢就没有办法去获取。啊,获取不了自然而然,你也不能让他去主动的帮我们去加载自定义的类啊,就是说白了让人家自己用的啊,你可以想象成呢,像这个核心类库就有点像有的这个国家的这种,比如皇室成员一样,是吧?啊,人家的这个饮食的话呢,有专门这个皇家的厨师啊,做的确实好吃是吧?啊你说你也给我做点,不好意思,你根本跟人家无法取得联系是吧?哎,他只能是负责给这个皇室成员去做啊,哎,就这样。
04:26
那么下一档,下一档呢,叫扩展类加载器,它呢,主要加载咱们像这个GRE有个lib,有个EST这个目录下的这个炸包,它加载这样里边的这些结构啊在哪呢?哎,在我们找一下啊,咱们装这个JDK。嗯,Java在这儿,然后咱们不是有GRE吗?Jre有一个lib lib有一个ES,这呢有很多的炸包,炸包呢,其实就是我们生成的那个点class文件呢,给它打包生成的里边呢都是自解码文件,那那这里边这个自解码文件对应的那些类呢,他们的加载都是使用这里提到的叫扩展类加载器做的。
05:06
啊,了解一下就可以了,那在下边呢,叫系统类加载器,系统类加载器呢,就像咱们这个自己定义的这些类啊,都是由这个系统类加载器帮我们加载的啊,你要是不满意,你还可以自定,那Java呢,这个还是非常的开放的啊,就基本上这些东西呢,除了他给你定义的都可以自定义啊,咱们这儿呢,就没有必要去讲这个自定义类的加载器了啊,那关于这个类的加载器呢,咱们这个通过代码的情况呢,再去了解一下,这呢,我专门写一个,哎,就叫做class loader的一个测试。哎,这个我们就了解类的加载器行这块我们写个代码。太随意。行T1啊,嗯,T1,比如说咱们说呢,啊,像自定义的这些类啊,自定义的这些类的话呢,都是咱们这个,呃,叫什么呀,叫系统类加载器帮我们加载的,那意味着像我们这个class loader test,它其实就是。
06:12
啊,它其实就是CTRLC一下CTRLV,那它呢,我们加class一下,先得到咱们当前这个大的class的实例,然后呢,我们去get一下啊叫A啊叫get一下叫class loader,这呢我们就获取到了当前咱们自定义这个类啊类加载器是谁?好,我们这块al enter生成一个这个变量啊我们不妨呢,就叫做class loader,那咱们这个输出一下啊,你看这个class loader呢是谁。诶,你看这个啊,这个叫具体的APP的一个class loader,这呢就是我们说的叫系统类加载器,看就是它了啊成它呢叫系统类加载器,那我们再怎么着呢,这个class loader,哎,我可以接着呢叫get它的parent parent就是它的上一层,哎上一层这个我们叫class load1吧,哎,接着再out一下。
07:12
诶,Class load1,诶看看它的上一层是谁。行,你看上一层这个呢,就是呃,Extension叫扩展类加载器,哎,扩展类加载器这是它的类型,这呢是它具体的一个对象的一个地址啊啊这呢就获取了啊叫扩展类加载器,那么通过这个扩展类加载器,这个叫class,一咱们再去get parent,看看还能不能再往上找,诶我叫LOAD2再往上找是不是该引导雷了。哎,看一下。你看是个no no,它不是没有啊,有只是呢,我们没有办法直接获取到,哎,因为你获取不到,所以呢,你也不可能主动的,你想让你比如说这个有了这个类的加载器以后,咱们呢,可以主动的让它去加载某一个类嘛,那咱们刚才呢,在这个获取方式四里边,其实就这样做的,那因为呢,咱们获取不到这个引导类加载器,进而的话呢,也不可能主动的让他去加载我们自定义的类啊,进而呢,就说清楚咱们刚才的一些事情啊,把这几个描述一下,第一个啊,我们说对于自定义类啊,它呢是使用叫系统类加载器啊进行加载,嗯,然后我们通过调用它的这个get parent哎,调用系统类加载器的。
08:42
啊叫get parent这个方法,诶可以呢,叫获取啊,这个叫扩展类加载器,那么通过扩展类加载器,你再调get parent,我们说是没有办法获取到这个阴道类加载器的,哎,调用扩展类加载器,诶加载器。
09:09
嗯,这钙片呢,是无法获取。哎,叫引导类哎加载器,那这个引导类加载器,我们这个多说一句哈,哎引导类哎加载器它呢,哎主要负责加载。哎,加载我们Java的这个核心类库,哎,是无法加载这个咱们自定义类的啊,行,那因为咱们获取不到,所以你所以呢,你也不可能去加载了,那这呢,提到说他主要负责加载我们Java的核心类库,那举个例子,比如说我这是一个string string.class获取到我们这个string这样的一个大的class了啊,然后接着呢,再去get它的一个叫class loader,那获取它的一个类加载器,我们说的它的类加载器,就是我们所说的引导类加载器,你看看能不能拿到。
10:16
那你看,这就是个闹。哎,这呢,其实能说明两个事情啊,第一个事情呢,你看我们这个这个到他这是个now,这呢就是引导类,我没拿没拿到,那你这个死string呢,它的加载器是谁加载的,首先说它肯定有没有这个string,也不可能加载到内存中,它有那是个nu,哎正好跟它一样,说明我们这个死string呢,哎是引导类加载器。帮我们加载的啊,这是相说呢,相当于呢,就是阴道类加载器,就是加载这个核心类库的啊,另外一方面呢,我们确实也是没有办法获取到的啊,就是这样一个原因,好这呢,大家作为一个了解内容就可以了,诶关于我们这个类的加载器的一个演示啊。
我来说两句