在Java中,双亲委派模型(Parent Delegation Model)是类加载器的一种工作模式。它确保了Java应用程序中的类加载过程既安全又高效。通过这种机制,Java虚拟机(JVM)能够有效地管理不同来源的类,并保证核心Java库的安全性。
双亲委派模型的工作原理
- 当一个类加载器收到加载某个类或接口的请求时,它首先不会自行尝试加载这个类,而是把这个请求委派给它的父类加载器去完成。
- 父类加载器接到请求后,同样会采用相同的方式处理:继续向上委派,直到启动类加载器(Bootstrap Class Loader)。这是最顶层的类加载器,负责加载JRE的核心类库,如
java.lang.*
、java.util.*
等基础包。 - 如果父类加载器无法加载目标类(即在父类加载器的搜索范围内找不到该类),子类加载器才会尝试自己去加载这个类。
- 若最终所有的类加载器都无法找到指定的类,则会抛出
ClassNotFoundException
异常。
类加载器层次结构
- Bootstrap Class Loader:这是最顶层的类加载器,用来加载核心Java库(位于
$JAVA_HOME/jre/lib
目录下),它是用本地代码实现的,不属于Java平台的标准部分,因此没有对应的Java对象。 - Extension Class Loader:负责加载Java的扩展类库,默认情况下会加载位于
$JAVA_HOME/jre/lib/ext
目录下的JAR文件。 - Application Class Loader:也称为系统类加载器,负责加载应用的类路径(classpath)上指定的所有类和包。
双亲委派模型的优势
- 避免重复加载:同一类只要被一个类加载器加载过,其他类加载器就会直接使用已加载的版本,避免了不必要的重复加载。
- 安全性保障:由于核心Java类总是由最顶层的类加载器加载,这可以防止用户自定义的类冒充核心类(例如
java.lang.String
),从而增强了系统的安全性。 - 统一性维护:确保了不同类加载器加载的同一个类在JVM中被视为同一个类,这对于保持程序的一致性和正确性至关重要。
总的来说,双亲委派模型是Java类加载机制的重要组成部分,对于维护Java应用程序的稳定性和安全性具有重要意义。理解这一模型有助于更好地解决类加载相关的复杂问题。
THE END