您的位置:首页 > 编程语言 > Java开发

java类加载的全过程

2016-07-18 21:21 260 查看
java类进行加载的全过程主要有五个方面:加载->验证->准备->解析->初始化

一、加载

1.通过此类的全名来获取此类的二进制字节流。

2.将此字节流所代表的静态储存结构转化为方法区运行时数据结构。

3.在堆中创建一个java.long.class对象作为方法区数据的入口。

//这个过程,数据的来源是不一定的,可能来源于网络或者class、zip等,java没有对这个地方进行限定,所以可以插入很多技术,类的加载器可以自己写也可以用系统的,可以自己定义记载怎样的字节流。

二、校验

检验的步骤为:文件格式验证、元数据验证、字节码验证、符号引用验证

文件格式验证:验证字节流是否符合Class文件格式的规范并 验证其版本是否能被当前的jvm版本所处理。ok没问题后,字节流就可以进入内存的方法区进行保存了。后面的3个校验都是在方法区进行的。

元数据验证:对字节码描述的信息进行语义化分析,保证其描述的内容符合java语言的语法规范。

字节码检验:最复杂,对方法体的内容进行检验,保证其在运行时不会作出什么出格的事来。

符号引用验证:来验证一些引用的真实性与可行性,比如代码里面引了其他类,这里就要去检测一下那些来究竟是否存在;或者说代码中访问了其他类的一些属性,这里就对那些属性的可以访问行进行了检验。(这一步将为后面的解析工作打下基础)。

//验证的作用主要是为了保证录入的字节流符合jvm的口味,为了防止其崩溃。

三、准备

这个阶段主要是为类变量(静态变量)在方法区中分配内存,并进行初始化值。

//要注意的是这个时候静态变量并没有赋值,只是进行了默认初始化赋值,因为java代码还没有执行,这个被赋值的过程是在java编译时期被clinit存储的。但是如果该变量被final关键值修饰,编译时期,会给该变量一个constanvalue属性,这个变量在这个时候就会被赋值。

//前面一、二、三过程除了程序员可以自定义加载器外,其余都是jvm主导的

四、解析

暂时还不知道

五、初始化

这个阶段主要执行的clinit操作,对变量进行初始化




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java class