00:00
那再举个例子啊,我们现在在程序当中啊,需要用到spi接口,那spi接口呢,我们说属于这个核心的API,那我们就使用这个双亲尾派机制啊,一次呢就是到引导类加载器,然后引导类加载器呢去加载RT.ja包,相当于把spi呢核心这个API呢就加载过来了,那么这里边呢,会存在一些interface接口,那接口呢,我们需要用一些具体的实现类了,那具体实现类呢,这就涉及到一些第三方的JA包了啊,我们要加载的是GBC点炸包,那我们要加载第三方的时候呢,这个时候呢,因为你是第三方的了,不属于核心的API,其实呢,就应该是由我们所谓的系统类加载器加载,所以这呢就出现一个叫诶反向委派啊,一直呢就委派到系统类加载器,那系统类加载器呢,这块实际上是由我们当前现成的啊,通过get contest class o啊获取到的,然后由它呢来加载,就是我们SPI接口的具体实现类啊。
01:00
GBC点炸包里边的这些API啊,所以这里边我们就会看到啊,接口呢,是由引导类加载器加载的,而具体接口的实现类啊是第三方的,是由我们这个线程上下文加载器加载的,而线程上下文加载器呢,就是我们的系统类加载器,咱们在前边呢,获取类加载器的时候呢,演示过通过线程来获取啊,一般情况下呢,我们拿到的都是一个呃系统类加载器呃,去加载我们第三方的GDBC点炸包下的这个API。OK,这就是我们这个图呢想说明的啊,那通过刚才举的这个例子呢,我们来说明一下双亲委派机制它的优势有什么啊,那首先呢,这里边儿提到了,它能够避免类的重复加载。啊,避免类的重复加载,那我们知道这个Java类呢,它所对应的这个类的加载器啊,随着这个加载器具有一个层次关系啊,这个负类啊等等有个层次关系,那么类呢,也就具有了这样的一个层次关系啊这种层次关系呢,就能够避免类呢是一个重复加载的,就像咱们刚才说的,哎,这个小孩拿着一个苹果,他先为他问他妈是吧,他妈在问这个孩子奶奶,诶这样的一个过程,一旦呢有类的加载器选择加载了,就不会再委托给他的这个子类加载器去加载了,所以避免了类的呃重复加载啊,这个应该是比较容易理解的啊,然后下个呢,我们说叫保护程序的安全,防止核心的API呢被随意的篡改。
02:31
哎,这个大家不知道能不能理解啊,其实呢,通过我们刚才那会儿讲的这个例子呢,应该很容易说明这个事儿,哎,我们在程序当中呢,需要用到字符串,但是呢,如果你从网络当中传输过来一个string啊,然后这个string呢,是你自定义的啊,如果呢,你是用它来加载的话呢,内部可能有一些恶意代码,对我们现有的项目程序呢,就进行了一个破坏。啊,那应该怎么做呢?你传过来这个string根本不好使,因为呢,你是浪包下的,我们仍然由引导类加载器进行加载,哎,是这样个情况啊,好,那这个说完以后,我们再举一个例子,比如说呢,我还是在这个浪包下,我定义一个新的类,这个类呢,我就叫做这个名字啊,这个是,呃,我习惯上给自己起个名啊,就是孙悟康start啊这个意思啊好,我定义了一个这样的类,大家知道在本身咱们RT点炸包的核心API当中,浪包下是不存在这个类的啊,那我现在就这样写了,而且呢,我还来了一个main方法啊,写一个输出语句,写一个hello。
03:33
那么针对于这样一个类,我们去执行一下看看。大家看这时候呢,也报错了,哎,他报错的这个信息呢,是安全的一个异常是阻止我们这个包名呢,就叫做Java点浪包啊,那这个怎么理解呢?啊还是啊,我们现在要执行这个方法,需要加载这个类,这个类呢按照双性尾派机制呢,一依次往上,哎,直到呢,找到引导类加载器,引道里加载器一看,说你是Java开头的,说这个事儿归我管,哎,那这个时候呢,我们就跑到还是说一下刚才的这个。
04:09
嗯,跑到这儿是吧,这个引导类加载器一看你是Java开头的,说这事儿呢归我管,然后引导类加载器呢,就要加载我们这个类了,那加载这个类呢,我们直接就给它报错了啊,就是相当于呢,是咱们Java点这个浪包呢,这个包呢要想访问是需要权限的,他们现在阻止我们去直接用这个包名来定义你一个自定义类,其实这呢也是起到一个保护作用哈,大家你想,如果说我们允许这样来做的话,已经区别于刚才这个了哈,你说string你用你自己的,OK,那我现在呢,我定一个呃,自定义的类啊,我就让你引导类加载器试图去加载,我如果加载成功了,那是不是可能会对引导类加载器本身造成影响。甚至说呢,把引导来加载器直接就整挂了是吧,诶所以呢,我们也禁止你自定义类呢,用这样的title是吧,这样的包名来去命名啊这呢,其实都是一个呃,安全的一个考虑。
05:04
那就是我们刚才提到的这个点,行,那通过刚才这个举例呢,大家对这两个点呢,应该有比较深刻的认识啊,那在回答这个双性有效机制的时候,除了能够说清楚它的一个工作原理,也要能够把它的这个优势啊,优点呢能够解释清楚啊,这就可以了。
我来说两句