00:00
那前面的话呢,咱们有一些呢,属于这个负极性的内容,咱们针对于这个类的加载器,整整个的这个所谓的这个呃,层次结构是吧,这个我们做了一个说明,那其次的话呢,我们再来看一下关于这个继承层面的一个关系,那这里边儿我们看这样一张图,那首先呢,我们提到这个图里边呢,不包括叫引导力加载器啊,因为它是用这个C和C加加语言呢进行编写的,那我们这里边看到的这个叫继承关系呢,它的顶层呢,叫做class loader。这呢是一个抽象类。哎,这是个抽象类,相当于呢,我们不会直接的去new这个class load这个实例了,对吧,那比较特别呢,就是说一下这个class呢,大家你看它的源码的时候呢,你会发现它的内部其实不包括抽象方法啊,就只是一个不能实例化的一个抽象类啊。好,它内部呢,定义了一些方法,它的子类呢,叫做secure class load,那在此类呢,叫做ul load,再往下的话呢,我们提到了两类,一类呢叫做扩展类加载器,一类呢叫做呃,应用程序类,或者呢叫做系统类加载器,它俩呢分别的都是继承于啊UR class order,这呢是我们的一个继承数的一个关系啊,那包括呢,刚才我们关于这个呃,几类不同的类的加载器呢的一些特征呢,咱们也做了一个说明,那这里边儿呢,我们先带着大家呢,来熟悉一下class loader里边关于这个类的一个描述。
01:24
那CLA呢,我们把它打开,那关于它这个描述呢,大家直接来看我们上边这个注解啊,哎,错了注释就可以了,那刚才呢,其实我们提到一些信息啊,在这里边呢,大家都可以看得到。啊,那如果呢,面试当中谈到这个问题的话呢,大家你直接就说我们看的是源码对吧,看的是这个正统的官方的这个注释信息。啊,那咱们呢,一起一块儿来进行一个解读啊,刚才呢,咱们讲到的一些信息在这里边呢,其实都可以看得到。好说呢这个class owner呢,它是一个具体的对象啊,它具体代表了一个正在这个用来呢,就是加载具体的这些类的是吧?好然后呢,这个class呢,它是一个抽象类,那刚才我们也提到了,那它的声明当中呢,加了一个叫abstract啊,但是内部呢,注意没有具体的这个抽象方法啊说呢这个呃班RY这呢是我们可以通过给定的一个自解码的一个文件的名字,那我们可以呢,使用这个类的加载器呢,去进行一个加载是吧。
02:22
OK,这是这样的一个行为,然后呢,这个通常情况下这个策略呢,是把它呢,呃,传递到我们这个具体的file名字上,接着呢,去读一个class file,诶从我们一个文件系统当中,OK啊行,这个呢,就是一个简单的一个我们这个class,它读取这个数据呢,来自于一个最行码文件是吧,你告诉我个名字啊,就主要说这个事儿了。然后再往下的话呢,说咱们可以通过呢,就是呃,具体的一个class的一个实例,调用get class loader啊调用这个方法呢,来获取呃,你这个类的加载器啊,那get class load呢,就我们刚才那块是不是也提到过这个方法是吧,然后关于这个get class这里边儿呢,那其实也描述了,说返回的就是当前你这个class,它对应的这个class load。
03:09
那有一些具体的实现呢,它可能会使用一个no啊,它代表的就是叫bustrap classo啊,就意味着呢,说如果这个class呢,它是通过叫bustrap class进行一个加载的,那么这个方法呢,就会返回一个now值,那这个咱们是不是就说过这个问题对吧。哎,说的其实就是这个事情,然后说如果一个呃,这个安全管理者,这个咱们用不着。那你看这块写的说,如果这个对象呢,它是一个基本数据类型,或者是wide或是no,哎,不是不是或者是no了,是一个基本数类型或者是word,它会返回一个叫做no,那刚才呢,咱们在代码中是不是也给大家去演示了,对于像基本数类型,我们返回了一个no,对吧?哎,就是这个意思。好,那这块我们再回到这个class这块呢,我们再进行一个说明。嗯,你看这里边说这个class对象说它呢可能是一个数组类型的啊,它呢并不是在我们这个class当中进行的一个创建。
04:08
那咱们刚才呢,也说这个问题了,它的创建呢,通常的话呢,是在我们Java运行的这个环境当中,在被需要的时候呢,我们进行了一个自动的一个创建,啊说这个class呢,呃,对于一个数组类型的来讲,那它可能会返,就是我们通过这个方法呢来进行返回,那它呢,跟我们这个。哎,它自己的元素使用的这个class的呢,是is the same,那是相同的,那刚才呢,我们也提到这样问题,说如果这个元素的话呢,是一个基本数据类型,那么这个数组呢,它就has no classo,那我们刚才呢,也是说到的,就是属于叫没有啊,是不是类将来器对吧?那就是这样一个意思。好。呃,下面说应用程序呢,它呃具体的实现这个子类克拉的子类呢,去扩展啊,这个呢就没啥了。然后再往下。
05:01
嗯,再往下我们看一下这块啊,说这个克拉斯的呢,它使用了一个具体的呃,授权的一个模式啊,去寻找具体的这个类和资源,其实这块呢,就提到了,我们说叫双亲委派模型啊,双亲委模型,比如说你看这个克拉苏呢,它具体的一个这种实例了啊,比如说引导类,呃,比如说这个扩展类啊,系统类啊等等是吧,它会关联一个副类的一个。类的加载器,就是它都有一个叫parent对吧,说当呢我们去,嗯要求呢,找到啊一个类或者资源,就是我们要进行加载的话呢,这个class的这个实例的话呢,它首先会授权这个你这个资源或者是这个类,嗯,给他的parent class so。啊,在他试图在当前自己这个卡拉斯的当中去这个加载这个资源或者类的这个前这个之前是吧,Before。这呢说的就是咱们讲的叫双亲委派模型啊,翻译成这个咱们中文的话来讲呢,就是当我们去加载一个类或者一个资源的时候呢,类的加载器呢,首先会授权给他的parent进行一个加载。
06:12
是吧,哎,这不就之前的意思嘛,说扎熏机它内建的这个内建的这个拉,就是我们所说的阴道里加载器,它呢是没有一个parent的,对吧?哎,但是呢,它可以诶为我们现有的这个class这个实力进行服务啊as一个parent是吧,就是这样一个场景,好这个呢是关于我们说的这个class load,然后呢,回过来呢,咱们刚才看到了这里边提到了这个呃,E class so和APPSO,这两个呢,咱们刚才呢,就是讲这两个结构的时候呢,也提到过他们这个代码,那这里边我们再稍微的啊看一下关于这个两个结构的一个情况啊,那我们要看的话呢,需要找的是谁呢?是这个later。在launcher这个内部啊,一个呢是E啊一个呢是我们说的这个叫。嗯,在。
07:02
来来来搜一下就行是吧,啊这是其中的一个,然后另外一个在这个上边啊APP class行,那么这两个呢,就是我们说的一个叫扩展类,一个呢叫做这个系统类啊加载器。好,那么这两个结构呢,我们创建的话呢,实际上是在我们这个launcher这个构造器当中来创建的,刚才呢,我们也带着大家呢看这个代码了,首先的话呢,它先创建的是一个叫做扩展类加载器,第二个呢,就是它对应的这个方法对吧?那么关于这块呢,我们再看一下点开。那这个呢,就相应的会去调用这个方法,这个方法里边你看我们最后呢,是new了一个launcher里边啊E器拉的,这就是个构造器嘛,把它传进来对吧,那这块我们调一下这个构造器,那就它这构造器里边呢,又调了这个super super呢大家注意一下我们这里边第二个参数。那第二个参数,我们现在呢,传进来的是一个nor对吧?哎,是一个nor值,这个now值影响的是什么?现在你在这看不出来,你看我点下这个super,大家会发现呢,这个第二个参数代表的就是parent,也就是说呢,我们现在啊,咱们这块呢,演示的谁呀?是不是一个EST class点叫扩展类加载器,扩展类加载器它的这个负类是谁呢?那我们这块呢,写的是个no。
08:15
注意我这块说的负类指的是它的那个上层类加气的意思啊,不是说它的负类的意思,把这个nor传过来super到这儿,那就这是个nor,然后再叫super,那就这个nor就传给了这个,然后再super,这个呢就传到到这儿,然后再点开,诶这个nor就赋给了这个parent,那就是当前你这个扩展类加载器,它的这个parent呢,这个值就是个no。哎,它的这个值就是个no是吧,哎,这个呢,我们就说清楚这个问题了,好,然后呢,我们再回到那当前你这个构造系当中。诶,那我们这时候呢,创建的你这个那extension class order扩展类呢,诶它的parent呢,就是个not值啊这就清楚了,然后呢,咱们再把这个你创建好的这个扩展类加载器的这个实例呢,放到咱们这个APP class的这样的这个方法里边,再点开,那就相当于是咱们这个传进来是那个扩展类的,对吧。
09:08
好它呢,这不又掉到这儿,然后又掉到这儿,然后相当于就是哎,这个掉到这儿这个参数吧,那这个参数,然后再往下走,那就到这,然后再点这。哎,就是A是不是点点跑跑远了。嗯,重来一下啊。这个APP,然后呢,调用他的这个方法。这个方法呢,这块我们传进来的是引导类的,引导类的使用,那就在这儿使用呗,然后点开它,然后传的是这个吧。啊,这个是在这儿看是吧,Super,然后点开。啊,点开这个super,然后诶这不就传到我们刚才也看到这了,这个位置传进来的是属于叫扩展类,诶然后再往这走super啊扩展类再往这走super啊再往这走这个参数这次啊这块赋了值是吧,相当于呢,我们在这个呃什么呀,在我们这个APP拉的里边呢,哎,它是把这个扩展类。
10:03
哎,作为它的一个parent来出现的。啊,这个是没问题的是吧,好再回过来,嗯,然后呢,我们再往下看的话呢,大家会看到这样的一行操作。你看这个什么意思说呢,这个呢叫thad.current th.side contest class order,就是设置一下我们上下文的类的加载器,哎,刚才呢,咱们说到一个点,就是说呢,我们调用这个current thread.get contest class这个时候哎,我说一下这个得到的上下文的类的加载器,其实呢,就是一个系统类加载器,那怎么去体现这个其实就是系统类加载器,那就是因为我们在这儿呢,有对应的这样一行代码。啊,进行了一个设置嘛,是吧,把当前这个loader就是我们得到的这个啊APP class so呢设置为啊这个上下文的类加载器。啊列加七,那就意味着咱们在这个代码当中,那比如说我们在这块,在大家你看我这块调用一下啊,thread.current th.get contest class load点,那我们呢,就直接它就行啊,然后pass out一下,输出一下当前这个类的加载器。
11:10
行,那此时的话,大家会看到我们得到的就是一个APP的一个class对吧,那相对呢,你就是一个系统类加载器,行,那刚才这块呢,咱们是通过这个class loader啊,这个class order呢,本身咱们做了一个说明,嗯,Class本身做说明,然后以及呢,我们看一下这个叫LA里边啊具体它的构造器中的这个基本信息,好然后呢,下边嗯,咱们再熟悉一下关于class load当中定义的几个方法。啊,这里边儿涉及到几个方法,那这个方法的熟悉呢,也影响到咱们下边呢,去自定义啊,这个类的加载器这样的问题。好,这个我们先听一下。
我来说两句