类的生命周期中,"加载"阶段之前通常统称为类加载过程,包括:加载、验证、准备、解析、初始化五个阶段。加载:通过全限定名读取字节流,生成 Class 对象;验证:校验字节码合法性(文件格式、元数据、字节码、符号引用),保证不危害 JVM;准备:为静态变量分配内存并赋零值(final 常量此时直接赋字面值);解析:把常量池中的符号引用替换为直接引用(可延迟到运行期);初始化:执行 <clinit>,即静态变量赋值与静态代码块,JVM 保证其加锁只执行一次——这正是静态内部类单例线程安全的原因。

双亲委派模型:类加载器收到加载请求后,先委托父加载器尝试,父加载器无法完成时自己才加载。层级为:启动类加载器(Bootstrap,加载 JAVA_HOME/lib 核心类)→ 扩展类加载器(JDK 9 起为平台类加载器)→ 应用类加载器(classpath)。

好处:避免类的重复加载,保证同一类在 JVM 中唯一(类 = 全限定名 + 加载它的类加载器);保护核心 API 不被篡改——用户自定义的 java.lang.String 永远委派给 Bootstrap 加载 JDK 的版本。

追问方向:哪些场景打破了双亲委派?自定义类加载器怎么做?

(约 360 字)