Skip to content
极高进阶

一句话答案

类加载请求先委托父加载器(Bootstrap→Extension→Application),父无法加载时子才加载,防止核心类被篡改。

核心要点

加载顺序: Bootstrap(核心库) → Extension(扩展库) → Application(应用类)

好处: 防止核心类被篡改(如自定义java.lang.String) / 避免类重复加载

打破方式: TCCL(SPI) / 重写loadClass / OSGi / Tomcat

追问与易错

追问方向:

  • 为什么要有双亲委派?(防止核心类被篡改,如自定义 java.lang.String)
  • 怎么打破双亲委派?三种方式?
  • Tomcat 的类加载为什么要打破双亲委派?(不同 WebApp 可能依赖同名类的不同版本)

易错点:

  • ❌ "双亲委派不可打破"——SPI/Tomcat/OSGi 都打破了
  • ❌ "委派"理解为"双亲都参与"——其实是单链委派到顶,不是两个父亲

💡 记忆锚点

类加载像逐级上报:应用层说"我不认识,交给上级",一直交到Bootstrap(最高层)。顶层能加载就加载,不能才退回下级。好处:谁都别想冒充java.lang.String。打破它:SPI用线程上下文类加载器(TCCL),Tomcat每个WebApp独立加载器。