标准答案
- 加载把类的字节流转换为运行时类结构,并创建对应的 Class 对象。
- 验证、准备和解析分别检查字节码、分配静态字段空间并解析符号引用。
- 初始化执行类初始化逻辑,通常在主动使用类时触发。
- 双亲委派不是所有类加载场景的绝对规则,容器、插件和模块系统可能使用自定义边界,但必须明确隔离策略。
题目解析
类加载过程和类初始化不是同一个动作。加载器先把字节流转成运行时结构,验证、准备和解析可能按需发生,初始化通常在主动使用并满足触发条件时执行。
双亲委派的主要价值是让核心类由可信的上层加载器加载,减少重复和类冒充;它不是禁止自定义加载器,而是自定义边界必须明确,尤其是插件、容器和模块隔离。
类的身份由类名和定义它的 ClassLoader 共同决定。同名类被不同加载器加载后可能无法互相赋值,排查 ClassCastException 时要看实际加载器。
常见误区
- 误区:类一被引用就立即完成所有初始化。改正:区分加载、链接和初始化,确认是否满足主动使用条件。
- 误区:把双亲委派说成禁止自定义 ClassLoader。改正:自定义加载器可以存在,但要定义委派顺序、隔离和核心类保护。
- 误区:忽略不同加载器的同名类身份不同。改正:排查类名、来源和 ClassLoader,而不是只看异常中的类名。