双亲委派机制

要了解双亲委派机制,首先要了解类加载器,而类加载器实现的功能就是在加载阶段获取二进制字节流的时候做的。

类加载器

双亲委派机制

每个加载器作用

启动类加载器:负责加载Java_HOME/lib目录中的类库,或通过-Xbootclasspath参数指定路径中被虚拟机认可的类库。

扩展类加载器:负责加载Java_HOME/lib/ext目录中的类库,或通过java.ext.dirs系统变量加载指定路径中的类库。

应用程序加载器:也叫做系统类加载器,负责加载用户路径(classpath)上的类库,一般来说,没有自定义加载器,这个就是默认的类加载器了。

自定义加载器:通过继承java.lang.ClassLoader实现的自定义加载器。

什么是双亲委派机制

JVM通过双亲委派机制对类进行加载。双亲委派机制指的是一个类在收到类加载请求后,他自己先不会去尝试加载这个类,而是把这个类加载向上委派给父类加载器,然后一层一层的向上委派,直到启动类加载器。然后如果父类加载器无法加载这个类,它就会向下委派给子类加载器,直到这个类加载成功。当然了,如果到最后的加载器都无法找到该类,就会报出ClassNotFoundException异常。

双亲委派类加载机制的类加载流程图

双亲委派机制

双亲委派机制的作用

双亲委派机制保障了类的唯一性和安全性。试想下,每个类的加载都要先经过父类的加载,只有父类没有的情况下,才会交给子类,这样就保证了类的唯一性。还有可以设想下,要是我们自己也创建了一个java.lang.String类,如果不是因为双亲委派机制,启动类加载器已经加载过了java.lang.String类,之后不会再加载,那么作为java核心类的String类就完全可能被篡改,所以双亲委派机制还保证了类的安全性

注:类加载器+类的全路径才是唯一确定一个类的判断标准。