答案:
1、安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心 API库被随意篡改
2、避免类重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一 次,保证被加载类的唯一性
首先:
解释之前,我们先来看一张图
其次:
为了解答问题,这里借类加载的关键代码复习一下,请见如下代码
首先,检查一下指定名称的类是否已经加载过,如果已经加载过了,就不需要再加载,直接 返回。
如果此类没有加载过,那么,再判断一下是否有父加载器;如果有父加载器,则由父加 载器加载(即调用parent.loadClass(name, false);),或者是调用bootstrap类加载器来加 载。
如果父加载器及bootstrap类加载器都没有找到指定的类,那么用当前类加载器的 findClass方法来完成类加载。
为了进一步证明双亲委派的作用,我们自己写一个String类,并且包名是一致的,看会不会被加载。
执行main方法,结果出现以下报错
说明:jvm加载的并不是我们自己写的String类,而是jdk中的String类,所以这个测试证明了类加载有双亲委派机制的存在,同时证明双亲委派机制的其中一个目的就是确保Jdk的核心API的安全,不被篡改,以免造成严重的后果
有同学会说,我如果自己写一个自定义加载器,岂不是就可以打破“安全机制了”,那我们自己写一个加载器来加载我们自己写的String类吧,
自定义加载器如下:
这就是java安全机制中对于恶意代码所采取的防护措施
第二点原因:
java虚拟机只会在不同的类的类名相同且加载该类的加载器均相同的情况下才会判定这是一个类。如果没有双亲委派机制,同一个类可能就会被多个类加载器加载,如此类就可能会被识别为两个不同的类,相互赋值时问题就会出现