类加载机制

类的加载就是将class文件加载到虚拟机(内存)中,并进行验证、准备、解析、初始化,形成JVM可使用的类

1.加载:①获取定一个类的二进制字节流(可以是class文件,也可以jar文件,war文件等)。

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

              ③生成代表这个类的java.lang.Class对象,可以实现反射机制(由class获取对象),一个类只能生成一个Class对象

2.验证:确保字节流包含的信息符合当前VM的要求,class文件不一定是java编译出来的,所以需要进行验证

              ①文件格式验证,验证是否符合class文件的规定,如版本号等

              ②元数据验证,对字节流描述的信息进行语义分析,保证符合语言规范

              ③字节码验证,通过数据流和控制流分析,确保语义符合法,符合逻辑

              ④符号引用验证,发生在将符号引用转化为直接引用的时候,在解析阶段完成,目的是检查除类自身以外的信息进行匹配性校验,比如引用的其他类是否存在,引用的类中的方法和字段是否存在,是否可访问。

              验证重要但不必要,如果代码都被反复验证过,则可使用-Xverify:none关闭

3.准备:为类变量(被static修饰)分配内存并初始化为零值(final除外),在方法区分配。

4.解析:符号引用(字面值)替换为直接引用

5.初始化:执行类构造器clinit,由编译器生成,用来对类变量赋值和执行静态代码块,若果没有赋值且没有静态代码块,则没有类构造器,不需要显示调用,虚拟机保证父类先于子类执行。虚拟机保证clinit线程安全,且只执行一次。接口如有类变量赋值,则有clinit,但只在使用的时候执行。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章