外观
一句话答案
类加载请求先委托父加载器(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独立加载器。