ClassLoader的主要职责就是负责加载各种class文件到JVM中。类的加载过程一般分为三个较大的阶段,加载阶段、连接阶段、初始化阶段。
加载阶段:查找并加载类的二进制数据。
连接阶段:分为以下三个阶段
+ 验证:确保类文件的正确性。
+ 准备:为类的静态变量分配内存,并且为其初始化默认值。
+ 解析:把类中的符号引用转换为直接引用。
初始化阶段:为类的静态变量赋予正确的初始值。
加载在加载阶段,会获取类的二进制数据,具体得可以从多个途径渠道获取。class文件、zip压缩包、网络、运行时计算、其他文件生成、数据库读取等等。
获取到二进制数据后会将其所代表的静态存储结构转化为方法区的运行时数据结构,之后在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口。
验证确保class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当做代码运行后不会危害虚拟机自身的安全。
文件格式验证
元数据验证
字节码验证
符合引用验证
准备变量的默认值设置
数据类型默认值Byte(byte) 0Char'u0000'Short(short) 0Int0Float0.0FDouble0.0DLong0LBooleanFalse引用类型null