类加载过程:加载 -> 连接 -> 初始化。连接过程又可分为三步: 验证 -> 准备 -> 解析。
一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式(重写一个类加载器的 loadClass() 方法)。数组类型不通过类加载器创建,它由 Java 虚拟机直接创建。
所有的类都由类加载器加载,加载的作用就是将 .class 文件加载到内存。
类加载器继承层次
JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自 java.lang.ClassLoader:
AppClassLoader 的父类加载器为 ExtClassLoader ExtClassLoader 的父类加载器为 null,null 并不代表 ExtClassLoader 没有父类加载器,而是 Bootstrap ClassLoader 。
- BootstrapClassLoader (启动类加载器) :最顶层的加载类,由 C++ 实现,负责加载 %JAVA_HOME%/lib 目录下的 jar 包和类或者或被 -Xbootclasspath 参数指定的路径中的所有类。
- ExtensionClassLoader (扩展类加载器) :主要负责加载目录 %JRE_HOME%/lib