一、双亲委派机制委派流程
双亲委派机制,就是JVM虚拟机加载类的时候,会优先委派上级类加载器进行类加载。
1、如果上级类加载器能找到这个类,那就由上级类加载器加载,并且对下级共享,反之不共享。
2、如果上级类加载器找不到这个类,那才由下级类加载器加载该类
3、如果下级类加载器也没有找到这个类,就会报错ClassNotFound。
二、双亲委派机制的优势
1、避免类的重复加载当自己程序中定义了一个和Java.lang包同名的类,此时,由于使用的是双亲委派机制,会由启动类加载器去加载JAVA_HOME/lib(java核心类库)中的类,而不是加载用户自定义的类。此时,程序可以正常编译,但是自己定义的类无法被加载运行。
2、保护程序安全,防止核心API被随意篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。
例如:自定义了一个java.lang.String的类,首先会由系统类加载器加载,系统类加载器识别到这个类不属于我加载,因为是JVM系统级别的类,此时应用程序加载器不会加载,会向上委托,直到启动类加载器,启动类加载器识别到这个类属于我来加载,就会去JAVA_HOME下去加载相同包名的String类。加载完成后,即使再有相同包名类名的String类也不会去加载,因为相同包名的类已经被加载过了,就会造成即使开发人员定义了和JVM级别相同包的类也不会去加载自己定义的类,保证了系统级别的类加载安全性,防止核心API被随意篡改。
3、让上级类加载器中的类对下级共享(反之不行),即能让你的类能依赖到 jdk 提供的核心类。
4、类加载有次序,保证核心类优先加载。
三、四种类加载器分别加载哪些类?