00:00
好,那这个呢,是咱们说最核心的一个方法,这个方法结束之后呢,我们看到在刚才的这个load class方法里边,咱们是不是调用了一个叫做find class的一个方法呀,对吧?哎,那下边我们就来看一下这个所谓的叫find class,诶首先的话呢,我们看一下在咱们这个class load里边,咱们的find class点一下好,大家会发现呢,咱们这个class的里边这个方法呢,虽然不是抽象的,但是它的这个方法体呢,是没有任何代码。没有任何代码,那那相应的这个方法呢,就需要被他的这个子类呢,去做一些重写是吧,那到底是谁重写了呢?咱们看一下这里边的这个逻辑你就知道了,那这个方法的话呢,在它的这个词类叫S克class so中没有操作,然后在它的下边这个词类12000CLASS的里边做了一个重写。做了个重写,然后呢,咱们的extension class和APP class这两个大家你看原版就知道,这两个里边呢,也没有再去重写这个find class。那对于言外之意呢,咱们使用的这个扩展类,还有这个应用程序类,其实用的都是这个find class这个操作,那在这儿呢,是重写了我们这个find class是吧?好,那这个final class呢,虽然没有重写,但是它的这个,呃,虽然没有方法体,但是它这个内部的逻辑是干什么,这个是确定的,看一下说查找二进制名称为内部的类,结果呢,返回这个,呃,浪包下的这个大的class的一个实例,这呢是一个受保护的方法。
01:24
受保护的方法呢,就意味着我们只能是不是在子类当中进行调用啊,对吧?诶在子类当中进行调用啊,说该方法呢,呃,会在检查完负类加载器之后呢,在那个class里边进行调用,哎,咱们刚才呢,不就看到这样逻辑吗?好,那这呢,我们提到了这样的两个方法,就是通过这个呢去调用,大家呢,你看这两个方法啊,咱们呢,调它的时候。啊,或者就说说这个事儿吧,咱们刚才呢在说明啊,关于这个user这个类。关于user这一类呢,加载的时候,那我们会发现这个load class,它主要体现的其实就是双亲委派机制,而我们这个user呢,最终被加载,实际上呢,咱们调的就是find的class的一个方法。
02:10
对吧,哎,就是调的一个find class方法,它呢是真正我们在加载一个,诶这个指定这个名的这个类的这样的一个操作的。啊,这样一个操作,那这里边你看提到了,在JDK1.2之前呢,咱们说那时候还没有双亲委派机制,所以呢,大家可以去重写这个load class方法,那现在的话呢,我们在1.2的时候呢,使用了双亲委派机制,而且建议呢,大家去遵循双擎委派机制,那这个时候呢,大家就没有必要再去重写这个load class方法了,那如果呢,你想按照指定的方式呢进行加载,咱们这时候呢,你只需要呢去重写这个find class的这个逻辑就行。嗯,调这个逻辑就可以了啊,哎,这里边你看我们写的就是这样一个意思是吧,然后这个find class呢,刚才咱们不是也提到了,他在。哎,在咱们这个URL class load当中进行了一个重写,那咱们打开一下那URL,哎,Class漏点是吧。
03:07
来点开啊,在这个结构当中啊,我们要找的是叫做范的class。哎,你看它是一个重写。嗯,没问题啊,那这块呢,给定一个这个名,我们返回一个大的class一个实例,你看它这里边主要做的这个事儿啊是什么呢?诶我们涉及到呢,这个名字的做一些替换是吧,找到我们对应的这个自解码文件,然后呢,把这个路径呢放过来,然后下边呢调这个def DeFine,诶DeFine这块呢,其实给定这个名,把这个资源呢放进去,哎,然后呢,帮我们返回一个大的class的一个实例,其实主要呢,我们这个find class。哎,它内部呢,是不是还得需要调一个叫DeFine class是吧。这个DeFine class呢,就相当于根据你给的啊,给我的这个二进制的数据啊,我给你返回一个大的class实例,这个逻辑呢,实际上是在我们这里边儿来完成的。哎,大家你也可以看一下我这个之前呢,已经写好的这个自定义的一个,呃,Class load是吧,咱们这个前面不是测试的命名空间的时候说过这个接口是吧,那我们重写的话呢,我这儿呢,就重写来叫find class。
04:11
啊,Class,然后呢,这个呃,对应的二进制数据呢,我通过这样一个操作呢,已经得到了,然后把这个二进制数据给了咱们这个DeFine class。啊,给了它,所以呢,我们说这个DeFine class。再回过来找一下,咱们这个叫URURL这个啊。这个class呢,它把这个数据呢,是封装在这到resource里了啊,其实典型的就是二进制的一个数据啊,它这个方法的主要作用是什么呢?是不是就是根据你给定的啊二进制流。那就涉及到它了是吧,给定的这个二进制流的这个数据,然后把它呢,还原成一个大的class的一个实例啊。对吧,哎,也就是说我们真正去加载一个类的时候呢,是需要这个方法里边要调这个方法,那这样子,然后你这个二进制数据的话呢,是从哪开始读多长,哎,这个呢,后边有相关的这个参数,那大家处理过I流IO流的话呢,这两个参数呢,其实并不陌生。
05:07
啊,不用陌生,然后这个方法的话呢,仍然是protected的,那那就意味着只能在这个子类当中,那我们才可以去调用是吧,才可以去调用啊。好,你看这里边通常它俩呢是搭配使用啊,没有问题的啊,哎,就是知道呢,我们说最重要的三个方法,在这里边呢,体现双性美白机制,呃,真正加载呢,是用find class find class里边呢,我们提供一个二进制流数据,这个二进制流数据呢,是在里边又调用了这个叫DeFine class,返回真正class实例,然后诶把它呢,就是这个return呢,其实是这个方法返回的结果是吧。哎,就这样个场景啊,那这不是在这里边返回的,调用的是它返回的结果是吧?行这个呢,就是我们说的核心的这呃三个方法啊,然后在下边呢,叫reserve class啊这个呢,其实咱们刚才在这里边是不是也见到了。就是呢,你是不是需要在加载当前class的同时呢,再去进行一个解析操作,这个呢,就对应的叫resolve class。
06:03
啊,就过了,然后find loaded class咱们刚才也说了,是不是已经加载过对吧?哎,这个parent这个咱们也提到过,行,那这呢,就是咱们关于这个class里边最核心的这几个方法啊,那么讲这个的意义是什么呢?那下边呢,就涉及到咱们取自定义是吧?哎,这个类的加载器,这个时候呢,我们就涉及到了有几种不同的方案了,那一种方案的话呢,那我们可以是怎么着啊,重写这个load class。那重写log class,你完全是不是可以把这个双亲委派机制给他干掉啊,啊,因为双亲委派机制呢,是在这里体现的,你重写,那你可以不用双亲委派机制,对吧?那另外一个逻辑呢,就是我们可以重写find class find class,嗯,这个是包含在我们这个load class里边,那你要是重写它的话呢,意味着呃,你还遵循了load class里边的双亲委派机制。啊,那这呢,就是我们重写的两种方式,那我们讲它的源码意义呢,就是大家呢也得知道,诶我们重写这两个的区别在哪里啊,那关于双性委外机制的好处和缺点,呃,破坏行为有哪些?哎,这个咱们下边的时候再展开说啊。
我来说两句