Java 知识 - ClassLoader 加载器


ClassLoader 介绍

ClassLoader 翻译过来就是类加载器,普通的 Java 开发者其实用到的不多,对于某些框架开发者来说却很常见。理解 ClassLoader 的加载机制,也有利于我们编写出更高效的代码。ClassLoader 具体作用就是将 class 文件加载到虚拟机中去从而生成对应的 Class 对象,并不是一次性加载所有的文件,而是根据需要去动态加载。

内置加载器

1、Bootstrap ClassLoader
核心类加载器,加载环境变量 %JRE_HOME%\lib 下的 rt.jar、resources.jar、charsets.jar 包内的 class 文件。
2、Extention ClassLoader
扩展类加载器,加载环境变量 %JRE_HOME%\lib\ext 目录下的 class 文件。
3、AppClassLoader
应用类加载器,加载 classpath 下的 class 文件。

Bootstrap ClassLoader 介绍

由 C/C++ 编写,它本身是虚拟机的一部分,所以它并不是一个 Java 类,也就是无法在代码中获取它的引用 ,JVM 启动时通过 Bootstrap 类加载器加载 rt.jar 等核心 jar 包中的 class 文件,之前学到的 Int.class, String.class 都是由它加载。

双亲委派原理

双亲委派机制,其工作原理的是,如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式的工作原理。

双亲委派模型好处

1、可以避免重复加载:当父亲已经加载了该类的时候,子类不需要再次加载。
2、避免核心类篡改:如果不使用这种委托模式,那我们就可以随时使用自定义的 String 来动态替代 java 核心 api 中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为 String 已经在启动时被加载。