项目里一个类从写完代码到真正可以 new 出对象,中间经历了什么?哪些阶段容易出问题?
我的判断
类从字节码到可用要经历加载、验证、准备、解析和初始化;项目事故多发生在依赖不一致、静态初始化和类加载器边界。
第一次主动使用类时,类加载器找到字节码并创建 Class;验证阶段检查格式和类型安全;准备阶段给静态字段分配空间并设默认值;解析把符号引用变成直接引用;初始化才执行静态字段赋值和 <clinit>。对象 new 还会继续分配内存、设零值、执行构造器。
这套流程对排障有直接帮助。ClassNotFoundException 是主动加载没找到类,NoClassDefFoundError 可能是依赖缺失,也可能这个类之前初始化失败;静态块访问配置或远程资源失败后,后续使用只会继续报类无法初始化。
我会用 -Xlog:class+load=info 或 JFR 看类由哪个加载器、从哪个 jar 加载,检查依赖树和第一条初始化异常。静态初始化只做确定、轻量的事情,网络调用和复杂业务放到可重试、可观测的启动组件里。