Java中类的加载机制

1.什么是类的加载?

将类的.class文件中的二进制数据读入内存当中,将其放在运行时数据区的方法区内,然后再堆上创建一个java.lang.class对象,用来封装类在方法区的数据结构。

注意 类的加载最终的产品是class对象。

2.类的生命周期:加载.验证。准备 解析 初始化 ,其实在真是的类的加载中并不一定是按照这个顺序进行的,解析阶段有可能延时执行,这与Java语言的加载机制有关

Java支持动态绑定技术

类的加载过程中虚拟机的工作:

通过一个类的权限定名获取二进制字节流

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

在Java堆上生成一个代表这个类的对象java.lang.class对象作为对方法区中这些数据的访问入口

验证的目的是为了确保Class文件中的字节流包含的信息符合当前虚拟机的要求,而且不会危害虚拟机自身的安全。不同的虚拟机对类验证的实现可能会有所不同,但大致都会完成以下四个阶段的验证:文件格式的验证、元数据的验证、字节码验证和符号引用验证。

1)文件格式的验证:验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理,该验证的主要目的是保证输入的字节流能正确地解析并存储于方法区之内。经过该阶段的验证后,字节流才会进入内存的方法区中进行存储,后面的三个验证都是基于方法区的存储结构进行的。 2)元数据验证:对类的元数据信息进行语义校验(其实就是对类中的各数据类型进行语法校验),保证不存在不符合Java语法规范的元数据信息。 3)字节码验证:该阶段验证的主要工作是进行数据流和控制流分析,对类的方法体进行校验分析,以保证被校验的类的方法在运行时不会做出危害虚拟机安全的行为。 4)符号引用验证:这是最后一个阶段的验证,它发生在虚拟机将符号引用转化为直接引用的时候(解析阶段中发
生该转化,后面会有讲解),主要是对类自身以外的信息(常量池中的各种符号引用)进行匹配性的校验

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

类初始化阶段是类加载过程的最后一步,前面的类加载过程中,除了加载(Loading)阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码。
初始化,为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化。在Java中对类变量进行初始值设定有两种方式:

①声明类变量时指定初始值

②使用静态代码块为类变量指定初始值

以上就是Java类的加载机制的总结

猜你喜欢

转载自www.cnblogs.com/ElegantWP/p/8858538.html