类加载过程是怎样的?
发布于
一、五个阶段
- 加载:通过类的全限定名获取二进制字节流,在内存中生成 Class 对象。
- 验证:校验字节码的合法性(魔数、版本、语义)。
- 准备:为类的静态变量分配内存并赋默认值(零值),final static 在编译期已赋值。
- 解析:把符号引用替换为直接引用。
- 初始化:执行
<clinit>方法,给静态变量赋程序设定的初始值,执行静态代码块。
二、双亲委派模型
加载器收到请求先委托给父加载器,父加载器找不到才自己加载。
- 启动类加载器(Bootstrap):rt.jar
- 扩展类加载器(Ext):jre/lib/ext
- 应用类加载器(App):classpath
好处:避免核心类被篡改,保证类的唯一性。
三、主动引用触发初始化
new 对象、访问静态变量、调用静态方法、反射、初始化子类时父类先初始化。