多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[toc] ## 一、类加载过程 >[danger] 数组类型不通过类加载器创建,它由 Java 虚拟机直接创建。 ### 类加载器 ![](https://img.kancloud.cn/64/43/6443eac893fe26ba7568f3947c24fea9_491x180.png) JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自`java.lang.ClassLoader`: 1. **BootstrapClassLoader(启动类加载器)**:最顶层的加载类,由C++实现,负责加载`%JAVA_HOME%/lib`目录下的jar包和类或者或被`-Xbootclasspath`参数指定的路径中的所有类。 2. **ExtensionClassLoader(扩展类加载器)**:主要负责加载目录`%JRE_HOME%/lib/ext`目录下的jar包和类,或被`java.ext.dirs`系统变量所指定的路径下的jar包。 3. **AppClassLoader(应用程序类加载器)**:面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类。 ## 二、双亲委派模型 ### 双亲委派模型介绍 每一个类都有一个对应它的类加载器。系统中的 ClassLoder 在协同工作的时候会默认使用**双亲委派模型**。 1. 即在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。 2. 加载的时候,首先会把该请求委派该父类加载器的`loadClass()`处理,因此所有的请求最终都应该传送到顶层的启动类加载器`BootstrapClassLoader`中。 3. 当父类加载器为null时,会使用启动类加载器`BootstrapClassLoader`作为父类加载器。 ![](https://img.kancloud.cn/83/e8/83e8d3d03fb2bd74194a6d2e6585b2e3_493x511.png) ## 三、参考 [搞定JVM面试之JVM 类加载器](https://snailclimb.gitee.io/2019/08/25/java/jvm/%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8/#toc-heading-3)