14.类加载器1

preview
需积分: 0 0 下载量 111 浏览量 更新于2022-08-04 收藏 97KB PDF 举报
### 类加载器详解 #### 一、类加载器概述 在Java编程中,类加载器(Class Loader)扮演着至关重要的角色。它不仅负责将类的二进制字节流加载到内存中,还参与了类的实例化过程。本文将深入探讨三种核心的类加载器:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)以及应用程序类加载器(Application ClassLoader)。此外,还将详细介绍双亲委托模型及其工作原理。 #### 二、启动类加载器(Bootstrap ClassLoader) 启动类加载器是所有类加载器中最基础的一种,主要负责加载存放在`JAVA_HOME/lib`目录中的核心类库或通过`-Xbootclasspath`参数指定路径中的类库。值得注意的是,启动类加载器是由C++语言实现的,是Java虚拟机(JVM)的一部分,因此用户无法直接引用它。其主要特点包括: 1. **加载范围**:启动类加载器加载的类库通常包括`rt.jar`等核心类库,这些类库对Java虚拟机至关重要。 2. **加载方式**:启动类加载器是通过C++语言实现的,而非Java语言。 3. **委托机制**:用户自定义类加载器若需将加载请求委托给启动类加载器,可以直接使用`null`来表示。 #### 三、扩展类加载器(Extension ClassLoader) 扩展类加载器负责加载位于`JAVA_HOME/lib/ext`目录下的类库,或者由`java.ext.dirs`系统变量指定路径下的类库。该类加载器由`sun.misc.Launcher$ExtClassLoader`实现。扩展类加载器的主要功能包括: 1. **加载范围**:扩展类加载器主要加载位于`JAVA_HOME/lib/ext`或`java.ext.dirs`指定路径下的类库。 2. **直接访问**:与启动类加载器不同,开发者可以直接访问并使用扩展类加载器。 #### 四、应用程序类加载器(Application ClassLoader) 应用程序类加载器负责加载用户指定的类路径(classpath)上的类库。它是`ClassLoader.getSystemClassLoader()`方法的返回值,因此通常被称为系统类加载器。应用程序类加载器的特点包括: 1. **加载范围**:应用程序类加载器主要负责加载用户定义的类库,即位于用户定义的类路径(classpath)下的类库。 2. **直接访问**:应用程序类加载器可以直接被开发者使用。 3. **默认加载器**:如果没有显式定义其他类加载器,则应用程序类加载器将成为程序的默认类加载器。 #### 五、双亲委托模型 双亲委托模型是Java类加载器的核心设计原则之一,用于管理类的加载过程。该模型要求每个类加载器除了顶层的启动类加载器外,都应该有自己的父类加载器。这种父子关系不是通过继承关系建立的,而是通过组合的方式实现。双亲委托模型的工作流程如下: 1. **请求处理**:当一个类加载器接收到类加载请求时,首先检查该类是否已经被加载。如果未被加载,则将该请求转交给其父类加载器处理。 2. **递归调用**:这一过程会一直递归进行,直到请求到达顶层的启动类加载器。 3. **最终处理**:如果父类加载器无法处理该请求,则交由子类加载器自行处理。如果仍然无法加载该类,则抛出`ClassNotFoundException`异常。 #### 六、类的唯一性 在Java中,类的唯一性不仅取决于类本身,还与其加载器有关。具体来说,即使两个类的全限定名相同,但如果它们是由不同的类加载器加载的,则这两个类被视为不相等。这里的相等是指通过`equals`方法、`isAssignableFrom`方法或`instanceof`关键字判断的结果。 ### 结论 类加载器在Java环境中起到了桥梁的作用,它们不仅负责将类加载到内存中,还确保了类的正确加载顺序和唯一性。通过理解启动类加载器、扩展类加载器和应用程序类加载器的职责以及双亲委托模型的工作原理,开发者能够更好地控制和优化Java应用的类加载过程。