在Java中,类加载的过程有一种特殊的机制,叫做“类加载机制”。类加载机制是指类在Java虚拟机(JVM)中的执行过程。也是Java程序能否正常执行的关键。它的具体执行过程是怎样的?接下来我们一起来看看吧。流程概述在JVM中,类加载会经历以下五个阶段:加载阶段(Loading)验证阶段(Verification)准备阶段(Preparation)解析阶段(Resolution)初始化阶段(Initialization):验证阶段、准备阶段和解析阶段它们合在一起又被称为连接阶段,所以以上五个阶段可以分为三类:加载阶段(Loading)连接阶段(Linking)验证阶段(Verification)准备阶段(Preparation)解析阶段(Resolution)初始化阶段(Initialization))具体分类如下图所示:这3个类5个进程的具体实现细节如下。1.加载阶段简单的说,加载阶段就是将类文件加载到内存中的过程。在加载阶段,JVM需要完成以下三件事:通过类的全限定名获取定义该类的二进制字节流;将这个字节流表示的静态存储结构转换成方法区的运行时数据结构;在内存中生成一个代表该类的java.lang.Class对象,作为该类各种数据在方法区的访问入口。2.连接阶段连接阶段又分为:验证阶段(Verification)、准备阶段(Preparation)和解决阶段(Resolution)。具体执行细节如下。2.1验证阶段验证阶段也称为验证阶段。主要用于验证加载到内存中的类是否是安全合规的文件。验证的主要动作如下(当然,如果后面的细节实在是记不住也没关系):文件格式验证包括常量池中的常量类型,是否删除了Class文件的各部分或附加其他信息等;元数据验证包括父类正确性验证(检查父类是否被最终修改)、抽象类验证等;字节码验证,这一步最为关键和复杂,主要用于验证程序中的语义是否合法和合乎逻辑;符号引用校验,比如类本身之外的常量池中各种符号引用的信息。###2.2准备阶段准备阶段开始为类中的静态变量设置默认值。注意这里不是给静态变量设置初始值,而是设置默认值。两者还是有很大区别的。比如代码中写的内容是:publicstaticintnumber=10;那么此时为number变量设置的int值就是默认值0,而不是初始值10。2.3分析阶段分析阶段是将常量池中的符号引用换成直接引用。所谓符号引用,是指用一组符号来描述所引用的目标。symbol可以是任何形式的字面值,只要能准确定位目标即可;而直接引用是一个可以直接指向目标的指针,一个相对偏移量,或者是一个可以间接定位到目标的句柄。符号引用和直接引用之间有一个重要的区别:当使用符号引用时,被引用的目标不一定要加载到内存中;使用直接引用时,被引用的目标必须已经存在于虚拟机的内存中。3、初始化阶段在初始化阶段,Java虚拟机实际上开始执行类中编写的Java程序代码,并将主导权转移给应用程序。经过这一步,类的加载过程就正式完成了。这个时候会设置静态变量的初始值,执行静态代码块的内容。总结类加载过程分为3类5个主要过程:加载:将类文件加载到内存中。链接阶段(Linking)验证阶段(Verification):类文件的安全作用。准备工作:为静态变量设置默认值。解析阶段(Resolution):将符号引用转换为直接引用。初始化阶段(Initialization):执行静态代码块,为静态变量设置初始值。本文已收录在Gitee开源仓库《Java 面试指南》,其中包括:Redis、JVM、并发、并发、MySQL、Spring、SpringMVC、SpringBoot、SpringCloud、MyBatis、设计模式、消息队列等模块。一次Java面试就够了,点击查看详情:面试:400+道Java常见面试题及解析,持续更新中……
