双亲委派机制

什么是双亲委派机制

双亲委派机制可以分为两个过程,一个是向上委托,一个是向下尝试加载。
首先,当类加载器需要加载某一个.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)


版权声明:本文为qq_45473634原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。