Java类加载器采用的一种类加载策略
- 该机制的核心:如果一个类加载器收到了类加载请求
- 默认先将该请求委托给父类加载器处理,
- 只有父级加载器无法加载该类时,才会尝试自行加载。
在JVM中,有三种类型的类加载器
- 启动类加载器(Bootstrap ClassLoader):负责加载 %JAVA_Home%/jre(Java Runtime Environment)/lib 目录下的核心 Java类库
- 扩展类加载器(Extension ClassLoader):负责加载%JAVA_HOME%/jre/lib/ext 目录下的扩展类库。
- 系统类加载器(System ClassLoader):
- 负责加载用户类路径(ClassPath)下的应用程序类。
加载机制
- 它们之间是父子关系,
- 启动类加载器是最顶层的类加载器
- 扩展类加载器是启动类加载器的子加载器
- 系统类加载器又是扩展类加载器的子加载器
- 当类加载器收到类加载的请求时,首先检查该类是否已经被当前类加载器加载
- 若该类未被加载过,当前加载器会将加载请求委托给父类加载器完成
- 若当前类加载器的父类加载器为null,会委托启动类加载器完成加载。
- 若父类加载器无法完成类的加载,当前类加载器才会去尝试加载该类。
双亲委派机制的优缺点
优点
- 避免重复加载
- 由于类加载直接从父类加载器那里加载类,避免了类的重复加载。
- 提高安全性
- 通过双亲委派模型,Java标准库中的核心类库(如java.lang.*) 由启动类加载器加载
- 这样能保证这些核心类库不会被恶意代码篡改或替换,从而提高程序的安全性
- 保持类加载的一致性:
- 这种方式确保了同一类的加载由同一个类加载器完成,
- 从而在运行时保证了类型的唯一性和相同性。
- 有助于减轻类加载器在处理相互关联的类时的复杂性
缺点
- 灵活性降低
- 由于类加载的过程需要不断地委托给父类加载器,
- 这种机制可能导致实际应用中类加载的灵活性降低
- 增加了类加载时间:
- 在类加载的过程中,需要不断地查询并委托父类加载器,这意味着类加载所需要的时间可能会增加。
如何破坏双亲委派机制
- tomcat web加载
- URL classloader 会优先加载指定的类路径。
- Java Agent
posted @
2025-05-19 13:44
kuki'
阅读(
26)
评论()
收藏
举报