Java虚拟机(JVM)中的类加载器采用了双亲委派模型(Delegation Model)。这是一种层次化的类加载机制,主要分为以下几个概念:
-
启动类加载器(Bootstrap Class Loader):
- 是最顶层的类加载器,负责加载Java核心类库(如
java.lang
包下的类)。 - 由C++实现,一般无法直接在Java代码中获取对其的引用。
- 是最顶层的类加载器,负责加载Java核心类库(如
-
扩展类加载器(Extension Class Loader):
- 是启动类加载器的子类,负责加载
java.ext.dirs
系统属性指定的目录中的类库。 - 通过
sun.misc.Launcher$ExtClassLoader
实现,可以通过Java代码获取引用。
- 是启动类加载器的子类,负责加载
-
应用程序类加载器(Application Class Loader):
- 也称为系统类加载器,负责加载应用程序classpath路径上的类库。
- 是扩展类加载器的子类,通过
sun.misc.Launcher$AppClassLoader
实现,可以通过Java代码获取引用。
-
自定义类加载器:
- 继承
ClassLoader
类的用户自定义类加载器,可以加载用户自定义路径上的类。
- 继承
双亲委派模型的工作流程:
- 当一个类加载器收到加载类的请求时,首先会检查自己是否已经加载过这个类。如果已经加载过,直接返回该类的Class对象。
- 如果类未加载,该加载器会将加载任务委派给其父类加载器,让父类加载器去尝试加载。这样的递归委派过程一直向上,直到达到启动类加载器。
- 如果启动类加载器无法加载该类,每个类加载器会尝试自己加载。如果加载成功,返回该类的Class对象;如果失败,再将加载任务委派给子类加载器。
优势和原理:
- 优势: 避免类的重复加载,确保Java核心类库的一致性,提高安全性。
- 原理: 当一个类加载器尝试加载类时,先委派给父类加载器,只有在父类加载器无法完成加载任务时,才尝试自己加载。这样层层递归,保证类的唯一性和一致性。
为何使用双亲委派模型:
- 避免类冲突: 如果每个类加载器都可以自行加载类,可能会导致类的重复加载,引发冲突和混乱。
- 确保安全性: 核心类库由启动类加载器加载,可以防止用户通过自定义类库替换核心类库,提高系统的安全性。
- 提高效率: 通过委派给父类加载器,可以利用已加载类的缓存,减少类的重复加载,提高效率。
Was this helpful?
0 / 0