双亲委派机制

知识点助记

比如你是一个小孩(子类加载器),你想要买一本新书(加载一个类)。你不会直接去书店自己买,而是先问爸妈(父类加载器)家里有没有这本书
如果爸妈说有,就直接用家里的;如果没有,你猜自己掏钱去买。

这保证了:

  1. 层次性:爷爷奶奶->爸爸妈妈->你 形成一个责任链
  2. 委托优先:永远让长辈解决,避免重复加载类
  3. 安全底线:防止乱买书(比如恶意代码替换核心类)

解析

其实双亲委派机制是Java类加载器的工作规则:当一个类加载器收到加载类的请求时,他不会自己加载,而是递归的委托给父类加载器去尝试,只有
父类加载器都失败时,他才亲自出马

Java中有三类核心类加载器

  1. BootStrap ClassLoader(爷爷辈):C++实现,加载JRE/lib下的核心库,比如java.lang.*
  2. Extension ClassLoader(父辈):加载JRE/lib/ext下的扩展库
  3. Application ClassLoader(子辈):加载用户类路径(ClassPath)的类

好处

  • 避免类重复加载:如果每个加载器都自己干,同一类可能被加载多次,浪费内存还容易导致类型混乱
  • 保证安全性与稳定性:防止恶意代码冒充核心类。通过委派,核心类永远由Bootstrap加载

总会先查自己 再问上级,提高性能

注意事项

双亲委派机制不是所有场景都适用
比如: SPI :JDBC驱动加载时,BootStrap加载器需要反向委托子加载器(线程上下文类加载器),否则找不到实现类