Java类的加载过程
最近在看周志明著的《深入理解Java虚拟机》,对类的加载过程有进一步的认识,对加载的基本过程进行一些总结;
一、类的加载器类型:
主要有三类,启动类加载器、扩展类加载器、应用类加载器
1)启动类加载器,主要加载工程中lib目录下的jar
2)扩展类加载器,主要加载lib目录下ext目录下的扩展jar
3)应用类加载器,也称系统类加载器,一般来加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类,如果没有自定义类加载器,则该加载器为默认加载器
二、类的加载过程:
加载---验证----准备-----解析-------初始化--------使用--------卸载
1、加载
通过类的路径获取.class的二进制流------将二进制流代表的静态存储结构转化为方法区运行时的数据结构-------在堆中生成一个代表这个类的class对象
2、验证
文件格式验证、元数据验证、字节码验证、符号引用验证
3、准备
正式为类变量分配内存地址,并设置类变量初始值,内存都将在方法区中分配。
注意:
1)这里的类变量只是被static关键字修饰的变量,不包括实例变量
2)设置类变量的初始值,不是用户计划设置的值,如:int a = 3; 这时设置变量a的初始值为0,而不是3
4、解析
将常量池内的符号引用转化为直接引用的过程
主要针对类或接口、字段、类方法、接口方法四类符号引用进行
5、初始化
1)初始化阶段是类的加载最后阶段,之前的加载过程只有加载阶段用户可以自定义加载器,其余阶段皆由Java虚拟机主导和控制,到初始化阶段,才真正执行类中定义的 Java代码
2)在准备阶段已经为类变量赋予类初始值,在初始化阶段是初始化程序员设定的初始值,如int a = 3;准备阶段将a初始化为0,在初始化阶段则将a变成3.