看个电影就能学会类的加载过程?我不信!

2023-11-03 23:51

本文主要是介绍看个电影就能学会类的加载过程?我不信!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

O、前言

今天我们来了解一下关于类的加载过程,这个问题在面试过程中属于高频面试题了。

那么回答的时候,我们往往会采取死记硬背的方式,告诉面试官类的加载过程包括:加载验证准备解析初始化这5个阶段。

但是如果面试官继续问到,这5个步骤都具体做什么呢? 我们就回答不上来了。

那么今天,我们就通过和好朋友们一起去看电影的例子,来再次理解类的加载过程。

一、加载阶段

1.1> 故事描述

今天是一个阳光明媚的周末,你和几个关系很好的同事们一同相约去看《变形金刚》这部电影,由于这部电影上市以来异常火爆,所以电影院外面就挤满了人,为了保持安全和观影顺序,工作人员把大家安排成一排排的队列,依次的进入到电影院

1.2> 过程分析

当我们通过编写java源码然后将其编译为class文件的时候,需要JVM将class文件加载进来才能执行我们所编写的程序逻辑,就正如上面故事所述的——“大家依次的进入到电影院”中。其实也类似于我们要玩某款主机游戏,我们会将游戏光片放入到PS5的光驱中让其执行光盘的读取操作。

具体流程是,JVM通过类的全路径名称,获取类的二进制数据流。然后,解析类的二进制数据流,转化为方法区(永久代or元空间) 内部的数据结构。并且,创建java.lang.Class类的实例对象,用来表示该类型。

二、验证阶段

2.1> 故事描述

随着大家陆续的都进入到了电影院,那么为了保障观影安全,安保人员会对每一名来看电影的观众进行安全检查,比如:是否携带了易燃易爆的东西。

2.2> 过程分析

验证阶段的目从它的名字中就可以看得出来了,就是为了保证第一步中加载的字节码是合法且符合规范的

这个过程大致可以分为4种验证内容:

格式检查】检查魔数、版本、长度等等。
语义检查】抽象方法是否有实现类、是否继承了final类等等编码语义上的错误检查。
字节码验证】跳转指令是否指向正确的位置,操作数类型是否合理等。
符号引用验证】符号引用的直接引用是否存在

三、准备阶段

3.1> 故事描述

你和观影的小伙伴们都顺利的通过了安全检查,那么由于这部《变形金刚》购票的时候选择的是3D电影,所以,门口的服务员小姐姐非常贴心的为您提供了观影所需要的3D眼镜,此时,大家都录取的来领眼镜,为观影前做最后的准备工作

3.2> 过程分析

准备阶段是正式 为类变量分配内存 并设置类变量的 初始值 阶段,即:在方法区中分配这些变量所使用的内存空间。

注意这里所说的初始值概念,比如一个类变量定义为:public static int v = 8080; 实际上变量v在准备阶段过后的初始值为0而不是8080,将v赋值为8080的put static指令是程序被编译后存放于类构造器<client>方法之中

但是注意,如果声明为:public static final int v = 8080; 在编译阶段会为v生成ConstantValue属性,在准备阶段虚拟机会根据ConstantValue属性将v赋值为8080 。

四、解析阶段

4.1> 故事描述

领完3D眼镜,大家终于进入了电影院,根据电影票中写的x号厅x排x座,来寻找实际的座位,大家陆陆续续的都坐到了自己的座位上

4.2> 过程分析

解析阶段是指虚拟机将运行时常量池中的符号引用替换为直接引用的过程。

那么,什么是符号引用?什么是直接引用呢?

符号引用指的是描述性的引用关系,比如上面故事中的“电影票中写的x号厅x排x座”,它只进行了座位的描述,并不是实实在在的座位;

直接引用则对应真正的引用关系,即上面故事中电影票所对应的真实的座位

这一点,我们可以通过javap -verbose指令来更直观的看到符号引用。

五、初始化阶段

5.1> 故事描述

经过了上面的所有步骤,电影放映的时间到了,大家开开心心的欣赏这部全球大作《变形金刚》……

5.2> 过程分析

到达这个阶段,类就可以顺利加载到系统中。此时,类才会开始执行Java字节码

初始化阶段是执行类构造器<client>方法的过程。<client>方法是由编译器自动收集类中的类变量的赋值操作静态语句块中的语句合并而成的。虚拟机会保证子<client>方法执行之前,父类的<client>方法已经执行完毕,如果一个类中没有对静态变量赋值也没有静态语句块,那么编译器可以不为这个类生成<client>()方法

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

这篇关于看个电影就能学会类的加载过程?我不信!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/341753

相关文章

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3