【JAVA】类加载过程,以及类加载器

类加载过程,以及类加载器

    • 一、类加载的过程
    • 二、类加载器介绍
    • 三、跨类加载
    • 三、举例说明

一、类加载的过程

类加载是Java虚拟机(JVM)将类文件加载到内存中并转换成对应的类对象的过程。它确保了类文件能够正确加载并转换成可执行的类对象,为程序的执行提供了必要的基础设施。类加载过程主要包括以下几个步骤:
在这里插入图片描述

  • 加载(Loading):加载是指将类的字节码文件(.class文件)从磁盘或者网络中读取到内存中的过程。类加载器根据类的全限定名(Fully Qualified Name)来定位和加载类文件。加载过程不包括对类文件的解析和验证,仅仅是将字节码加载到内存中形成类对象的初始状态。
  • 验证(Verification):验证是指对加载的类文件进行字节码验证、符号引用验证等过程,确保类文件的格式和内容符合Java虚拟机规范,防止恶意代码或者不规范的代码对系统造成安全漏洞或者错误。
  • 准备(Preparation):准备是指为类的静态变量分配内存空间,并设置默认初始值的过程。在准备阶段,静态变量会被初始化为默认值,例如整数类型的默认值是0,引用类型的默认值是null。
  • 解析(Resolution):解析是指将类中的符号引用转换为直接引用的过程。在Java中,类的方法调用、字段访问等操作都是通过符号引用来实现的,解析阶段将这些符号引用转换为实际内存地址,使得程序可以直接访问类的方法和字段。
  • 初始化(Initialization):初始化是指执行类的初始化代码(静态代码块和静态变量赋值语句)的过程。在初始化阶段,JVM会按照类加载的先后顺序依次执行静态代码块和静态变量赋值语句,完成类的初始化工作。

需要注意的是,类加载过程是按需进行的,并不是一次性加载所有类文件。当程序需要使用某个类时,类加载器会先加载该类及其所依赖的类,然后进行验证、准备、解析和初始化操作。类加载器会按照委派模型逐级向上委托加载类,直到找到合适的类加载器为止。

对于已经加载的类会被放在 ClassLoader 中。在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。也就是说,对于一个类加载器来说,相同二进制名称的类只会被加载一次。
在这里插入图片描述

下面这个截图是ClassLoader类,里面有一个Vector变量用来存由这个类加载器加载的类。
在这里插入图片描述

二、类加载器介绍

具体来说,Java虚拟机中的类加载器主要分为以下几种:

  • 启动类加载器(Bootstrap Class Loader):负责加载Java的核心类库,例如java.lang.Object等。
  • 扩展类加载器(Extension Class Loader):负责加载Java的扩展类库,例如java.lang.String等。
  • 应用程序类加载器(Application Class Loader):也称为系统类加载器,负责加载应用程序的类,例如项目中自定义的类。
  • 自定义类加载器:开发者可以根据需要编写自定义的类加载器,用于加载特定的类或者资源。

三、跨类加载

跨类加载器指的是在Java虚拟机(JVM)中存在多个类加载器,这些类加载器可能会加载同一个类,导致在内存中存在多个版本的类实例。这种情况下,如果涉及到静态变量,可能会出现静态变量在不同类加载器加载的类中存在多份实例的情况

当存在多个类加载器时,如果不同的类加载器加载了同一个类,就会出现类实例的多个版本。对于静态变量,它们属于类级别的变量,在类加载时被初始化,因此不同类加载器加载的同一个类中的静态变量会有不同的实例。

这种情况下,如果静态变量被跨类加载器共享,可能会导致数据不一致的问题。因此,在设计应用程序时,需要考虑到类加载器的影响,合理使用静态变量,避免跨类加载器共享静态变量可能带来的问题。

三、举例说明

假设有一个简单的Java应用程序,其中包含一个类 MyClass,以及一个静态变量myStaticVariable,同时存在两个不同的类加载器A和B。

public class MyClass {public static int myStaticVariable = 0;public static void main(String[] args) {MyClass.myStaticVariable = 10;System.out.println("静态变量值:" + MyClass.myStaticVariable);}
}

现在,我们假设类加载器A加载了MyClass 类,而类加载器B也加载了同一个 MyClass 类。由于静态变量属于类级别的变量,因此每个类加载器都会为静态变量myStaticVariable分别创建一个实例。

假设在类加载器A中的MyClass类中修改了静态变量的值:

public class MyClass {public static int myStaticVariable = 0;static {myStaticVariable = 20;}public static void main(String[] args) {System.out.println("静态变量值:" + MyClass.myStaticVariable);}
}

而在类加载器B中的MyClass类中没有修改静态变量的值:

public class MyClass {public static int myStaticVariable = 0;public static void main(String[] args) {System.out.println("静态变量值:" + MyClass.myStaticVariable);}
}

那么,当在不同的类加载器中运行这两个版本的MyClass类时,会得到不同的输出结果:

在类加载器A中运行时,输出结果为"静态变量值:20",因为在类加载时,静态代码块将静态变量myStaticVariable的值设置为20。
在类加载器B中运行时,输出结果为"静态变量值:0",因为没有修改静态变量的值,保持默认值0。
这种情况下,就展示了静态变量在跨类加载器情况下可能出现的多份实例的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/322830.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4_Water插件_Buoyancy组件使用

water插件提供了一个浮力Actor蓝图类。 需要注意的几个问题: 1、StaticMesh需要替换根组件。 2、需要模拟物理设置质量。 3、需要添加浮力组件,设置浮力点,应用水中牵引力。

Unity Animation--动画剪辑

Unity Animation--动画剪辑 动画剪辑 动画剪辑是Unity动画系统的核心元素之一。Unity支持从外部来源导入动画,并提供创建动画剪辑的能力使用“动画”窗口在编辑器中从头开始。 外部来源的动画 从外部来源导入的动画剪辑可能包括: 人形动画 运动捕捉…

【Linux】Linux——Centos7安装RabbitMQ

目录 安装包准备socaterlang 安装rabbitmq安装命令启动rabbitmq,两种方式查看rabbitmq 启动后的情况配置并开启网页插件关闭防火墙或开放端口测试登录问题配置web端访问账号密码和权限添加用户,后面两个参数分别是用户名和密码.添加权限修改用户角色再次…

24_Scala集合Map

文章目录 Scala集合Map1.构建Map2.增删改查3.Map的get操作细节 Scala集合Map –默认immutable –概念和Java一致 1.构建Map –创建kv键值对 && kv键值对的表达 –创建immutable map –创建mutable map //1.1 构建一个kv键值对 val kv "a" -> 1 print…

十四五”智慧城市:视频大数据汇聚系统2.0建设方案与特点分析

一、背景需求分析 随着科技的不断发展,智慧城市的建设已经成为城市发展的重要方向。视频汇聚系统作为智慧城市建设的重要组成部分,已经得到了广泛的应用和推广。视频汇聚系统是智慧城市中非常重要的组成部分,它利用摄像头和传感器技术来收集…

压缩机继电器EOCRDS-30NY7Q升级后型号:EOCRDS3-30S

EOCR-DS3系列型号: EOCRDS3-05S EOCRDS-05S EOCRDS1-05S EOCRDS3-30S EOCRDS-30S EOCRDS1-30S EOCRDS3-60S EOCRDS-60S EOCRDS1-60S EOCRDS3-05W EOCRDS-05W EOCRDS1-05W EOCRDS3-30W EOCRDS-30W EOCRDS1-30W EOCRDS3-60W EOCRDS-60W EOCRDS1-60W EOCR-DS3T-…

分享10个高质量宝藏网站~

分享一波高质量宝藏网站~ 这10个宝藏网站,个个都好用到爆,娱乐、办公、学习都能在这里找到! 1、Z-Library https://zh.zlibrary-be.se/ 世界最大的免费电子书下载网站!电子书资源超千万,不过这个网站不太稳定&#…

学习torchmd分子动力学模拟

TorchMD打算提供一种简单易用的API,用于使用PyTorch进行分子动力学。这使研究人员能够更快地进行力场开发研究,并以PyTorch的简单性和强大性将神经网络潜力无缝集成到动力学中。 TorchMD使用与经典MD代码(如ACEMD)一致的化学单位&…

数据结构——二叉排序树

懒猫老师-数据结构-(58)二叉排序树的删除(二叉查找树)_哔哩哔哩_bilibili 概念 (1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值; (2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值; (3)它的左右子树也都是二叉排序树。 通…

SMB 协议详解之-TreeID原理和SMB数据包分析技巧

在前面分析SMB协议数据包的过程中,这里,可以看到在SMB协议中存在很多的ID,即Unique Identifiers。那么这些ID表示什么含义?在实际分析数据包的过程中如何根据这些ID进行过滤分析?本文将介绍SMB/SMB2中的tree id ,并介绍如何通过tree id 快速的分析SMB数据包中各种命令交互…

配置完串口,用了printf函数,LCD屏不显示了

配置完串口后,记得打开微库! /* USER CODE BEGIN PFP */u8 rx[2];u8 rx_buff[10];int fputc(int c, FILE* s){u8 ch[1] {c};HAL_UART_Transmit(&huart1,ch, 1, 0xfff);return c; } /* USER CODE END PFP */

数据结构-链表练习(面试题)

1,翻转一个单链表 建立变量cur指向第二个节点,curN指向cur.next,将第二个节点的next改为head,headcur这样实现,前两个节点顺序的翻转,第二个节点指向了第一个节点,之后cur向后移(cu…

设计模式之前端控制器模式

想象一下,你的Java Web应用是个交响乐团,每个功能模块是乐手,而用户请求就像是一首首待演绎的曲目。在这场音乐盛宴中,谁来保证演出的流畅与协调?答案就是——前端控制器模式!它如同乐队的指挥,…

unaipp推荐算法的汽车租赁系统zaxzu 微信小程序hbuiderx

随着现代汽车租赁管理的快速发展,可以说汽车租赁管理已经逐渐成为现代汽车租赁管理过程中最为重要的部分之一。但是一直以来我国传统的汽车租赁管理并没有建立一套完善的行之有效的汽车租赁管理系统,传统的汽车租赁管理已经无法适应高速发展,…

python3安装教程

1.下载python 百度网盘下载python-3.12.3-amd64.exe 链接:https://pan.baidu.com/s/1MV3kvVdjCdS_G-_KgefwLw?pwdpgzu 提取码:pgzu 官网下载:Welcome to Python.org 有很多版本,选择需要的版本下载 2.安装python 双击python-…

静态分配IP,解决本地连接不上Linux虚拟机的问题

在Window环境下,使用远程终端工具连接不了VMware搭建的Linux虚拟机(CentOS 7),并且在命令行ping不通该Linux虚拟机的IP地址。下面通过配置网关解决本地与Linux虚拟机连接问题: 1 查看虚拟机网关地址 在VMware虚拟机上…

鸿蒙开发-ArkTS语言-容器-非线性容器

鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 文章目录 前言 一、非线性容器 1.HashMap 2.HashSet 3.TreeMap 4.TreeSet 5.LightWeightMap 6.LightWeightSet 7.P…

Angular中组件之间的传值

Angular中组件之间的传值 文章目录 Angular中组件之间的传值前言一、父亲向儿子传值二、儿子向父亲传值三、爷爷向孙子传值四、兄弟之间的传值 前言 Angular的组件是构成应用的基础单元,它们封装了HTML模板、TypeScript代码以及CSS样式,以实现特定的功能…

2024蓝桥杯CTF writeUP--packet

根据流量分析,我们可以知道129是攻击机,128被留了php后门,129通过get请求来获得数据 129请求ls Respons在这 里面有flag文件 这里请求打开flag文件,并以base64编码流传输回来 获得flag的base64的数据 然后解码 到手

产品推荐 | 基于 Virtex UltraScale+ XCVU3P的FACE-VPXSSD-3PA 存储板

01 产品概述 FACE(FPGA Algorithm aCceleration Engine)FPGA算法加速开发引擎是基于FPGA可编程器件构建的一系列算法加速开发引擎平台。FACE-VPXSSD-3PA存储平台是FACE系列中的一员。该平台板载2组2GB 64bit DDR4、2路QSFP28光接口、4个NVME SSD M.2接口…