java类进行加载的全过程主要有五个方面:加载->验证->准备->解析->初始化
一、加载
1.通过此类的全名来获取此类的二进制字节流。
2.将此字节流所代表的静态储存结构转化为方法区运行时数据结构。
3.在堆中创建一个java.long.class对象作为方法区数据的入口。
//这个过程,数据的来源是不一定的,可能来源于网络或者class、zip等,java没有对这个地方进行限定,所以可以插入很多技术,类的加载器可以自己写也可以用系统的,可以自己定义记载怎样的字节流。
二、校验
检验的步骤为:文件格式验证、元数据验证、字节码验证、符号引用验证
文件格式验证:验证字节流是否符合Class文件格式的规范并 验证其版本是否能被当前的jvm版本所处理。ok没问题后,字节流就可以进入内存的方法区进行保存了。后面的3个校验都是在方法区进行的。
元数据验证:对字节码描述的信息进行语义化分析,保证其描述的内容符合java语言的语法规范。
字节码检验:最复杂,对方法体的内容进行检验,保证其在运行时不会作出什么出格的事来。
符号引用验证:来验证一些引用的真实性与可行性,比如代码里面引了其他类,这里就要去检测一下那些来究竟是否存在;或者说代码中访问了其他类的一些属性,这里就对那些属性的可以访问行进行了检验。(这一步将为后面的解析工作打下基础)。
//验证的作用主要是为了保证录入的字节流符合jvm的口味,为了防止其崩溃。
三、准备
这个阶段主要是为类变量(静态变量)在方法区中分配内存,并进行初始化值。
//要注意的是这个时候静态变量并没有赋值,只是进行了默认初始化赋值,因为java代码还没有执行,这个被赋值的过程是在java编译时期被clinit存储的。但是如果该变量被final关键值修饰,编译时期,会给该变量一个constanvalue属性,这个变量在这个时候就会被赋值。
//前面一、二、三过程除了程序员可以自定义加载器外,其余都是jvm主导的
四、解析
暂时还不知道
五、初始化
这个阶段主要执行的clinit操作,对变量进行初始化