java类加载即将.class字节码文件转换成二进制流加载到jvm内存中并初始化的过程。主要包括加载、连接(验证、准备、解析)、初始化3个步骤。
1.加载
将类的class文件加载到内存,并创建java.lang.Class对象。加载类的来源通常有以下几种:
- 从本地文件系统加载class文件,这是绝大部分程序主要的类加载来源。
- 从jar加载class文件,例JDBC编程用到的驱动类就是从JAR加载。
- 通过网络加载class文件
- 从数据库加载class文件
2.连接
连接阶段主要做3件事:验证、准备、解析。
1>验证
验证主要检查被加载的类是否具有正确的内部结构,并和其它类协调一致。确保class文件的字节流信息符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括4种验证:文件格式验证、元数据验证、字节码验证,符号引用验证。
- 文件格式验证
验证字节流是否符合class文件格式规范,并且能被当前虚拟机加载处理。例主次版本号是否在当前虚拟机处理范围内。常量池是否有不被支持的常量类型。
- 元数据验证
对字节码描述的信息进行语义分析,分析是否符合java语法规范。
- 字节码验证
最重要的验证环节,分析数据流和控制,确定语义是否合法,是否符合逻辑。主要针对元数据验证后对方法体的验证保证类方法在运行时不会有危害出现。
- 符号引用验证
确保引用一定会被访问到,不会出现类等无法访问的问题。
2>准备
为类的静态变量分配内存,并设置默认初始值。这些变量使用的内存都在jvm方法区分配。
3>解析
将类的二进制数据中符号引用替换成直接引用。
3.初始化
初始化类静态变量,实例变量分配内存并初始化。
类的初始化顺序为:
父类静态成员/static块->子类静态成员/static块->父类普通成员/非static块->父类构造函数->子类普通成员/非static块->子类构造函数