Java类加载的过程

Java 的类加载过程是怎样的? 通过加载器,Java 能够在运行时灵活加载类,实现模块化设计、插件机制等功能。文件中的字节码加载到 JVM 中,并进行验证、解析和初始化,最终使类能够使用的过程。是 Java 虚拟机(JVM)中负责将类的字节码加载到内存中的组件。Java 的类加载过程实现了字节码的动态加载、验证与管理,保证了 Java 程序的安全性和平台无关性。加载器是 Java 动态类加载机制的核心部分,允许在运行时加载类,而不是在编译时确定所有类。类加载器负责查找并加载类的字节码。Java 的类加载过程是怎样的? 阅读详情

Java虚拟机中类加载的过程包括加载、验证、准备、解析和初始化这五个阶段

一、加载

此阶段虚拟机完成3件事情:

  1. 通过一个类的全限定名来获取定义此类的二进制字节流。
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

其中,获取二进制字节流不一定是从Class文件中获取,例如:

  1. 从 ZIP 包读取,成为 JAR、EAR、WAR 格式的基础。
  2. 从网络中获取,最典型的应用是 Applet。
  3. 运行时计算生成,例如动态代理技术,在 java.lang.reflect.Proxy 使用 ProxyGenerator.generateProxyClass 的代理类的二进制字节流。
  4. 由其他文件生成,例如由 JSP 文件生成对应的 Class 类。
  5. 从数据库中读取,例如有些中间件服务器(如SAP Netweaver)可以选择把程序安装到数据库来完成程序代码在集群间的分发

二、验证

验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

验证阶段大致会完成4个阶段的检验动作

  1. 文件格式验证
  2. 元数据验证 
  3. 字节码验证
  4. 符号引用验证

三、准备

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这里有两点需要注意一下

  1. 此时进行内存分配的仅包括类变量(被static修饰),不包括实例变量
  2. 初始值“通常情况”下是数据类型的零值
public static int value = 123;//变量value在准备阶段过后的初始值是0而不是123

特殊情况,如果类变量是常量,那么它将初始化为表达式所定义的值而不是 0

public static final int value = 123;//变量value在准备阶段过后的初始值是123

                                              表1 不同数据类型所对应的零值 

数据类型零值
int0
long0L
short(short)0
char'\u0000'
byte(byte)0
booleanfalse
float0.0f
double0.0d
referencenull

四、解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析阶段在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定。

  • 符号引用:以一组符号来描述所引用的目标
  • 直接引用:可以是直接指向目标的指针、相对偏移量或是能间接定位到目标的句柄

五、初始化

类初始化阶段是类加载过程中的最后一步,到了初始化阶段,才真正开始执行类中定义的Java程序代码(或者说是字节码)。在准备阶段,变量已经赋值过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。初始化阶段是执行类构造器<clinit>()方法的过程

  • <clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态句句快可以赋值,但是不能访问。
class Test{
	static {
		i = 0;
		System.out.println(i);
	}
	static int i = 1;
}
public class Demo{
	public static void main(String[] args){
		Test test = new Test();
	}
}

运行结果

  • <clinit>()方法与类的构造函数不同,不需要显示地调用父类构造器,虚拟机会保证子类的<clinit>()方法执行之前,父类的<clinit>()方法已经执行完毕。由于父类的<clinit>()方法先执行,也就意味着父类中定义的静态语句块要优先于子类的变量赋值操作。
class Father{
	public static int A = 1;
	static{
		A = 2;
	}
}
class Son extends Father{
	public static int B = A;
}
public class Demo{
	public static void main(String[] args){
		System.out.println(Son.B);
	}
}

运行结果

  • <clinit>()方法对于类和接口并不是必须的,如果一个类中没有静态语句块,也没有对变量的赋值操作,那么编译器可以不为这个类生成<clinit>()方法。
  • 执行接口中的<clinit>()方法不需要先执行父接口的<clinit>()方法,只有当父接口中定义的变量使用时,才会初始化。
  • 虚拟机会保证一个类的<clinit>()方法再多线程环境中被正确地加锁、同步。

关于类在什么情况下会初始化,可以参考这篇文章

https://blog.youkuaiyun.com/LZAlgorithm/article/details/88903017

Java基础:类加载的过程 Java类加载是将字节码文件加载到JVM内存并转换为可执行类型的过程,包含7个生命周期阶段(加载、验证、准备、解析、初始化、使用、卸载)。核心流程包括:通过ClassLoader获取字节流(加载)、验证安全性(验证)、分配静态变量内存(准备)、替换符号引用(解析)和执行初始化代码(初始化)。类加载器采用双亲委派模型确保核心类安全,其中Bootstrap、Extension和Application类加载器分别负责不同层级的加载。 阅读详情

相关推荐

VM与欧姆龙PLC通讯设置实战:Fins TCP/UDP协议详解

本文详细解析了VM(VisionMaster)与欧姆龙PLC通过Fins TCP/UDP协议进行通讯的实战设置。内容涵盖网络配置、协议选择(TCP可靠性与UDP实时性)、VM端地址映射与数据点添加、以及数据接收解析流程,并提供了常见错误排查与高级调试技巧,帮助视觉与自动化工程师快速实现稳定可靠的工业通讯集成。

weixin_29172963的博客 333

Java类加载过程详解

首先我们应明确在Java中类的生命周期是什么,引用一张图像进行说明使用(Using)卸载(Unloading)

chris3will的博客 5248

吐血总结《Mysql从入门到入魔》,图文并茂

文章目录1. 查询1.1 查询多列1.2 检索唯一值1.3 限制输出1.4 注释2. ORDER BY 排序2.1 单列排序3.2 多列排序3.3 指定排序方向4. WHERE 过滤数据4.1 WHERE 子句操作符4.2 范围值检查4.3 空值检查5. 高级数据过滤5.1 WHERE 组合过滤5.2 IN 操作符5.3 NOT 操作符6. 通配符过滤6.1 % 通配符6.2 _ 通配符7. 创建计算字段7.1 计算字段7.2 拼接字段7.3 执行算数计算8. 函数8.1 常用文本处理函数8.2 日期和时间

向日葵的专属太阳 3万+

Java类的加载过程

应用程序根据自身需要自定义的ClassLoader,如Tomcat、Jboss都会根据j2ee规范实现ClassLoader。

w1lgy的博客 9566

基于MATLAB的数字滤波器之低通滤波器

本文首先介绍了数字低通滤波器的概念和原理,其次论述了低通滤波器的技术指标和设计步骤,最后给出了数字低通滤波器应用于信号去噪的MATLAB代码。

总结论文中的算法并给出论文的复现代码 3万+

【跳频通信】基于MATLAB的跳频通信系统仿真

同时,跳频通信也具有良好的抗干扰能力,即使有部分频点被干扰,仍能在其他未被干扰的频点上进行正常的通信。由于跳频通信系统是瞬时窄带系统,它易于与其他的窄带通信系统兼容,也就是说,跳频电台可以与常规的窄带电台互通,有利于设备的更新。跳频是最常用的扩频方式之一,其工作原理是指收发双方传输信号的载波频率按照预定规律进行离散变化的通信方式,也就是说,通信中使用的载波频率受伪随机变化码的控制而随机跳变。从通信技术的实现方式来说,“跳频”是一种用码序列进行多频频移键控的通信方式,也是一种码控载频跳变的通信系统。

FPGA/MATLAB学习教程/源码/项目合作开发 6267

Java类加载过程

Java虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这个过程被称作虚拟机的类加载机制。在 Java 语言里面,类型的加载、连接和初始化的过程都是程序运行期间完成的,这种策略让 Java 语言进行提前编译会面临额外的困难,也会让类加载时稍微增加一些性能开销,但是却为 Java 应用提供了极高的扩展性和灵活性。Java 天生可以可以动态扩展的语言特性就是依赖于动态加载和动态连接这个特点实现的。

weixin_46058921的博客 2365

某Z节验证码

某Z节验证码、captchaBody、滑块、旋转、空间推理

mamenqi_csdn的博客 773

Java类加载过程是怎么样的?

Java类加载过程可以分为加载、验证、准备、解析和初始化五个阶段。下面我会详细解释每个阶段,并给出相应的代码演示。

Blue92120的博客 1554

HTML爱心字母雨(完整代码)

HTML语言实现爱心字母雨的完整代码。

AIGC 2万+

200、从零搭建具身智能实验平台:硬件选型软件栈与调试

我一开始图便宜,3D打印了一个平行夹爪,结果抓取力不够,稍微重点的物体就滑落,而且开合控制延迟大,VLA模型输出的动作指令根本跟不上。如果你非要自己做,记住两个原则:一是用谐波减速器而不是直驱,二是加力传感器,哪怕是一个简单的电阻应变片也行——没有力反馈,你的夹爪就是个瞎子。我的建议是,如果你用的是UR5老款,ROS1的ur_modern_driver包更成熟,但如果你要跑最新的VLA框架,很多库已经不支持ROS1了。所以,保持耐心,多备份代码,多记录日志,少熬夜。毕竟,这条路上,我们都是摸着石头过河。

sundong_81的博客 39

java类的加载过程

Java 类加载机制 类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。 其中类加载过程包括加载、验证、准备、解析和初始化五个阶段。 类的加载过程.png 类的加载过程 加载 1、通过类加载器,加载.class文件到内存中。 2、将读取到.classs数据存储到运行时内存区的方法区。 3、然后将其转换为一个与目标类型对应...

Chain的博客 1873

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

代码的魅力,根本走不出来 2203

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java中类加载过程详解

而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式(重写一个类加载器的。综上,解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,也就是得到类或者字段、方法在内存中的指针或者偏移量。综上,解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,也就是得到类或者字段、方法在内存中的指针或者偏移量。

2401_86844317的博客 2934

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java面试必备:Java类加载过程详解

Java虚拟机(JVM)加载Class文件到内存,并对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这个过程称为类加载。

qq_58299462的博客 1104

Java 类加载过程

加载:在该阶段,类的字节码文件被加载到内存中,并被存储在方法区中的运行时常量池内。验证:在验证阶段,对字节码文件的合法性进行检查,以确保它满足Java虚拟机的规范要求,并且不会对虚拟机产生安全风险。准备:在准备阶段,为类的静态变量分配内存,并设置默认初始值。解析:在解析阶段,将常量池中的符号引用转换为直接引用。初始化:在初始化阶段,对类的静态变量进行初始化,并执行静态代码块。使用:在使用阶段,类被加载到内存中,并可以被其他类引用和使用。

Flying_Fish_roe的博客 906

Java中的类加载过程

类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

Black_cat_look的博客 1252

JAVA类加载过程

1. JVM类加载过程 1.概述 从类的生命周期而言,一个类包括如下阶段: 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序进行,而解析阶段则不一定,它在某些情况下可能在初始化阶段后在开始,因为java支持运行时绑定。 2. 类加载时机 加载(loading)阶段,java虚拟机规范中没有进行约束,但初始化阶段,java虚拟机严格规定了 有且只有如下5种情况必须立即进行初始化(初始化前,必须经过加载、验证、准备阶段): (1)使用new实例化对象时,读取和设置类

代码大师麦克拉瑞的博客 2191

JAVA对象创建过程和类加载过程

fill:#333;color:#333;color:#333;fill:none;加载验证准备解析初始化使用卸载。

huing的博客 828

反无人机C2指控AI大模型本地部署:从车载到指挥中心的硬件选型实战

AI大模型在军事指挥控制(C2)和反无人机等关键任务场景中的应用正加速落地,本地化部署成为保障数据安全、降低通信时延的必然趋势。然而,硬件选型往往成为决定系统成败的首要难题:算力、显存、功耗与物理形态如何精准匹配任务剖面?从车载边缘节点的轻量化推理,到区域指控中心的多路并发分析,再到大型指挥中心的算力池设计,不同层级对GPU、内存、存储及供电的需求差异巨大。模型量化策略、推理框架选择及多模态、RAG、AI Agent等增量因素,同样反向制约着硬件配置。基于实际项目经验,从算力测算方法论与避坑指南出发,解析反

weixin_34195364的博客 231

类加载过程 JAVA

自定义类加载器是为了加载在jvm三个加载器负责的目录范围之外的类/*** @Description: 自定义类加载器} //parent: 指定父加载器, AppClassLoader/ExtClassLoader/Bootstrap public MyClassLoader(ClassLoader parent , String classPath) {//要求返回的是你要加载的字节码文件的Class对象. //这里都是我们说了算的。

DarkPumpkin的博客 1067

java类加载过程和类加载器

java类加载过程和类加载器 一:类加载概述 首先我们了解一下类是怎么进入内存的,jvm把class文件加载到内存,然后对文件进行校验,转换解析和初始化变 成可以被虚拟机直接利用的java类型,这就是虚拟机的类加载机制。java类的加载,链接和初始化都是在运行阶段进行 的,这虽然会带来一定的性能开销,却在灵...

0bug0warning的博客 334

【JAVA】聊聊类加载过程

Java 通过引入字节码和 JVM 机制,提供了强大的跨平台能力,理解 Java 的类加载机制是深入 Java 开发的必要条件。本篇博文的重点是,请介绍类加载过程,什么是双亲委派模型? 一般来说,我们把 Java 的类加载过程分为三个主要步骤:加载、链接、初始化,具体行为在 Java 虚拟机规范里有非常详细的定义。首先是加载阶段(Loading),它是 Java 将字节码数据从不同的数据源读取到 JVM 中,并映射为 JVM 认可的数据结构(Class 对象),这里的数据源可能是各种各样的形态,如 jar

ZLF_1024的博客 252
上一篇: Java中对类进行初始化(主动引用,被动引用)
下一篇: 双亲委派模型
AE86上山啦
博客等级 码龄8年 5粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值