在 Java 中,类的实例化流程分为两个部分:类的加载和类的实例化。类的加载又分为显式加载和隐式加载。大家使用 new 关键字创建类实例时,其实就隐式地包含了类的加载过程。对于类的显式加载来说,比较常用的是 Class.forName。其实,它们都是通过调用 ClassLoader 类的 loadClass 方法来完成类的实际加载工作的。直接调用 ClassLoader 的 loadClass 方法是另外一种不常用的显式加载类的技术。
类加载器负责装入类,搜索网络、jar、zip、文件夹、二进制数据、内存等指定位置的类资源。一个JAVA程序运行,最少有三个类加载器示例,负责不同类的加载。还有一种是用户自定义的类加载器。
1、BootStrapClassLoader-核心类库加载器。由C/C++实现,无对应的java类。处于类加载器层次结构的最高层,负责 sun.boot.class.path 路径下类的加载,默认为 jre/lib 目录下的核心 API 或 -Xbootclasspath 选项指定的 jar 包。
2、ExtClassLoader-拓展类加载器。ExtClassLoader的实例,加载路径为 java.ext.dirs,默认为 jre/lib/ext 目录或者 -Djava.ext.dirs 指定目录下的 jar 包加载。
3、AppClassLoader-应用程序加载器。AppClassLoader的实例。加载路径为 java.class.path,默认为环境变量 CLASSPATH 中设定的值。也可以通过 -classpath 选型进行指定。
4、CustomClassLoader-用户自定义类加载器。用户自定义 ClassLoader 可以根据用户的需要定制自己的类加载过程,在运行期进行指定类的动态实时加载。
ClassLoader 在加载类时有一定的层次关系和规则。这四种类加载器分别负责不同路径的类的加载,并形成了一个类加载的层次结构。