目录
什么是双亲委派机制
双亲委派机制可以分为两个过程,一个是向上委托,一个是向下尝试加载。
首先,当类加载器需要加载某一个.class字节码文件时,则首先会把这个任务委托给他的上级类加载器,重复此过程,直至委托到了启动类加载器。
然后,启动类加载器去尝试加载该.class文件,查看该.class文件是否属于自己的加载范畴,是则加载,不是则让下级类加载器尝试加载,重复此过程。要是最初的类加载器的所有上级加载器都没有加载该.class文件,最初的类加载器才会加载。
类加载器的类别
以下顺序为父加载器(上级类加载器)到子加载器(下级类加载器)
BootstrapClassLoader(启动类加载器)
BootstrapClassLoader(启动类加载器)
c++编写,加载java核心库 ,也就是 %JAVA_HOME%/lib 路径下的jar包。由于启动类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。 (获取启动类加载器会返回null值)
ExtClassLoader (标准扩展类加载器)
ExtClassLoader (标准扩展类加载器)
java编写,加载扩展库,也就是 %JAVA_HOME%/jre/lib/ext 路径下的jar包,开发者可以直接使用标准扩展类加载器。
AppClassLoader(应用程序类加载器)
AppClassLoader(应用程序类加载器)
java编写,加载程序所在的目录,CLASSPATH路径下指定,如未设置则为应用程序当前路径。
CustomClassLoader(用户自定义类加载器)
CustomClassLoader(用户自定义类加载器)
java编写,用户自定义的类加载器,可加载指定路径的class文件。可以由 ClassLoader.getSystemClassLoader() 方法获得,所以一般也称它为系统类加载器。
JAVA_HOME、CLASSPATH这些是系统环境变量中的参数名,%JAVA_HOME%对应该参数值
双亲委派机制的执行过程
图片源于网络。
双亲委派机制的作用
1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。(如,你写了一个Java.lang.String类,通过双亲委派机制就不会加载这个类,而是加载核心库中Java.lang.String)