文章目录
- Java中的类加载器有哪些
- 什么是双亲委派模型
Java中的类加载器有哪些
Java中的类加载机制是指Java虚拟机(JVM)将类文件(.class文件)加载到内存中,并对类进行解释和初始化的过程。类加载机制包括加载、链接(验证、准备、解析)和初始化三个主要步骤。Java中的类加载器负责执行这些步骤。
Java提供了以下几种内置的类加载器:
- 引导类加载器(Bootstrap ClassLoader):
- 这是最顶层的类加载器,它负责加载Java标准库中的类,这些类通常位于
<JAVA_HOME>/jre/lib
目录(如rt.jar
)。 - 引导类加载器是用原生代码实现的,它加载的类通常不会被Java程序直接引用。
- 这是最顶层的类加载器,它负责加载Java标准库中的类,这些类通常位于
- 扩展类加载器(Extension ClassLoader):
- 它负责加载Java的扩展库,这些库位于
<JAVA_HOME>/jre/lib/ext
目录或由系统属性java.ext.dirs
指定的目录中的类库。 - 扩展类加载器是
sun.misc.Launcher$ExtClassLoader
类的实例。
- 它负责加载Java的扩展库,这些库位于
- 系统类加载器(System ClassLoader):
- 它负责加载当前应用的classpath上的类。
- 系统类加载器是
sun.misc.Launcher$AppClassLoader
类的实例。
除了这些内置的类加载器,开发者还可以自定义类加载器来实现特定的加载策略。自定义类加载器通常是通过继承java.lang.ClassLoader
类来实现的。
类加载器的工作机制是基于委托模型(Delegate Model)。当一个类需要被加载时,系统会首先请求父类加载器加载,只有当父类加载器无法加载该类时,才由当前类加载器尝试加载。这种机制保证了Java核心类库的安全性和稳定性,因为核心类库总是由引导类加载器加载的,而不会受到其他类加载器的干扰。
什么是双亲委派模型
双亲委派模型(Parents Delegation Model)是 Java 类加载器体系的一个重要特性,它规定了当一个类加载器收到类加载的请求时,它首先不会自己去尝试加载这个类,而是将这个请求委派给父加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的引导类加载器中,只有当父加载器无法加载某一个类时,子加载器才会尝试自己去加载。
双亲委派模型的核心思想是保证 Java 程序的稳定性和安全性,它要求除了顶层的引导类加载器外,其余的类加载器都应当有自己的父类加载器,通过这样的方式实现类加载器的层次化管理。
具体来说,双亲委派模型的工作流程如下:
- 当一个类加载器收到类加载的请求时,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。
- 每一个层次的类加载器都是如此,因此
所有的加载请求最终都应该传送到最顶层的引导类加载器
中。 - 如果父加载器可以完成类加载任务,就成功返回,否则子加载器才会尝试自己去加载。
双亲委派模型保证了 Java 程序的稳定性和安全性
,它要求除了顶层的引导类加载器外,其余的类加载器都应当有自己的父类加载器,通过这样的方式实现类加载器的层次化管理。
需要注意的是,双亲委派模型仅适用于类的加载阶段,而类加载完成后,类加载器与类的关系就变得不那么紧密了。例如,类的初始化阶段会涉及到类的静态变量赋值、静态代码块的执行等,这些工作是由类加载器之外的JVM来完成的。