优势
避免类的重复加载
通过向上委托的方式,如果一个类已经被父加载器加载了,就不会再重复被子类加载器所加载。
保护程序安全,避免核心API被篡改 (沙箱安全机制)
比如自定义一个包叫 java.lang,里面有String类,这时就相当于是去篡改了java的核心类库。
而双亲委派机制就实现了核心api的保护,因为在加载自定义String类时会往上委派给bootstrap引导类加载器加载,而引导类加载器在加载的时候会jkd自带的rt.jar包中的String类。这样就可以保证java核心源代码的保护。
举例
自定义一个java.lang.String
public class String {
public static void main(String[] args) {
System.out.println("aa");
}
}
运行:
原因就是,当运行main()方法时,首先会加载main方法所在类String,而通过双亲委派机制,加载进jvm的实际上是核心类库的String类,而该String类时没有main方法的,所以报错。