Java 面试题:类加载与双亲委派

一、类加载过程

加载 → 链接(验证 → 准备:静态变量赋零值 → 解析:符号引用转直接引用) → 初始化(执行 <clinit>,静态块/静态变量赋值)。

二、双亲委派

类加载器层级:Bootstrap(C++、rt.jar)→ Extension → Application。加载时自底向上委托父加载器,父无法加载才自己来。

目的 说明
安全 防止核心类(如 java.lang.String)被篡改
唯一 同一类只加载一次,避免重复

三、破坏双亲委派

  • SPI(JDBC):核心接口由 Bootstrap 加载,但实现在应用包,需线程上下文类加载器反向加载;
  • 热部署/容器:Tomcat 用 WebAppClassLoader 优先加载 Web 应用类;
  • OSGi 模块化自定义网状委派。

面试常问:为什么双亲委派、如何打破、类初始化时机(new/getstatic 等触发)。