双亲委派机制

Java类加载器采用的一种类加载策略

  1. 该机制的核心:如果一个类加载器收到了类加载请求
  • 默认先将该请求委托给父类加载器处理,
  • 只有父级加载器无法加载该类时,才会尝试自行加载。

在JVM中,有三种类型的类加载器

  1. 启动类加载器(Bootstrap ClassLoader):负责加载 %JAVA_Home%/jre(Java Runtime Environment)/lib 目录下的核心 Java类库
  2. 扩展类加载器(Extension ClassLoader):负责加载%JAVA_HOME%/jre/lib/ext 目录下的扩展类库。
  3. 系统类加载器(System ClassLoader):
  • 负责加载用户类路径(ClassPath)下的应用程序类。

加载机制

  1. 它们之间是父子关系,
    • 启动类加载器是最顶层的类加载器
    • 扩展类加载器是启动类加载器的子加载器
    • 系统类加载器又是扩展类加载器的子加载器
  2. 当类加载器收到类加载的请求时,首先检查该类是否已经被当前类加载器加载
  3. 若该类未被加载过,当前加载器会将加载请求委托给父类加载器完成
  4. 若当前类加载器的父类加载器为null,会委托启动类加载器完成加载。
  5. 若父类加载器无法完成类的加载,当前类加载器才会去尝试加载该类。

双亲委派机制的优缺点

优点

  • 避免重复加载
    • 由于类加载直接从父类加载器那里加载类,避免了类的重复加载。
  • 提高安全性
    • 通过双亲委派模型,Java标准库中的核心类库(如java.lang.*) 由启动类加载器加载
    • 这样能保证这些核心类库不会被恶意代码篡改或替换,从而提高程序的安全性
  • 保持类加载的一致性:
    • 这种方式确保了同一类的加载由同一个类加载器完成,
    • 从而在运行时保证了类型的唯一性和相同性。
    • 有助于减轻类加载器在处理相互关联的类时的复杂性

缺点

  1. 灵活性降低
  • 由于类加载的过程需要不断地委托给父类加载器,
  • 这种机制可能导致实际应用中类加载的灵活性降低
  1. 增加了类加载时间:
  • 在类加载的过程中,需要不断地查询并委托父类加载器,这意味着类加载所需要的时间可能会增加。

如何破坏双亲委派机制

  • tomcat web加载
  • URL classloader 会优先加载指定的类路径。
  • Java Agent
posted @ 2025-05-19 13:44  kuki'  阅读(26)  评论(0)    收藏  举报