京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

Java中的类加载过程、双亲委派和模型打破场景

2026-2-23 11:11| 发布者: 啊啊啊啊啊腾| 查看: 15| 评论: 0

摘要: Java中的类加载一、类加载过程(一个Java类的生命周期)类加载过程整体包括:加载->验证->准备->解析->初始化1、加载(1)加载阶段类加载器会通过类的全限定名获取.class文件的二进制流,然后将二进制流代表的静态数

Java中的类加载

一、类加载过程(一个Java类的生命周期)

类加载过程整体包括:加载->验证->准备->解析->初始化

Java中的类加载过程、双亲委派和模型打破场景

1、加载

(1)加载阶段类加载器会通过类的全限定名获取.class文件的二进制流,然后将二进制流代表的静态数据结构转化为方法区的运行时数据结构

(2) 同时在内存开辟一块区域存储Class对象,作为方法区该类的数据访问入口

2、链接

(1)验证

主要用来防止恶意或错误的字节码危害jvm

(2)准备

准备阶段主要为类变量(静态变量,也就是static修饰的变量)分配内存并赋初值。

关于赋初值

jvm默认的初值是这样的:

A. 基本类型(int/long/short/char/byte/bool/float/double)默认值是0

B. 引用类型的默认值是null

C. 常量的默认值就是我们程序中设定的值,比如我们程序中定义static int a = 100, 则准备阶段 a赋初值就是100

(3)解析

解析阶段是将常量池中的符号引用替换为直接引用的过程(符号引用:class文件中的符号。直接引用:直接指向目标对象的指针、偏移量或一个间接定位到目标的一个句柄

3、初始化

类加载过程中的初始化过程是这样的:执行clinit方法,完成所有类变量(静态变量,也就是static修饰的变量)的赋值动作,包括静态属性显式赋值、静态代码块赋值。

这里要注意的是在类加载的初始化阶段,只会完成与类相关的静态赋值语句和静态语句的初始化,也就是有static关键字修饰的信息,而没有static修饰的赋值语句和执行语句在实例化对象的时候才会运行。

关于初始化和实例化

初始化发生在类加载过程的最后一个阶段,

实例化则是指创建类的对象实例的过程,是在堆内存分配对象空间并初始化对象状态的过程(一般通过new关键字或其它方式创建对象时触发)

4、卸载

一个java类被卸载需要同时满足以下3个条件:

(1)这个类的所有实例都已经被回收,也就是jvm堆中不存在该类的任何对象实例

(2)加载该类的类加载器已经被回收。

(3)该类的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法

如果同时满足上述3个条件,这个java类就会被卸载,所谓卸载就是在方法区中清空该类的所有信息,此时一个java类的生命周期也就结束了。

二、类加载机制

jvm的类加载机制是双亲委派机制。

Java中的类加载过程、双亲委派和模型打破场景

1、类加载时机

类的加载不是程序启动的是一次完成的,而是按需加载,即只有在使用的时候才把.class文件加载到内存。

2、类加载模型

JVM采用双亲委派模型来加载类。

一个类加载器收到类加载请求,首先自己不会去加载,而是把请求委托给父类加载器去执行 -> 如果父类加载器还存在其父类加载器,则进一步向上委托,直到顶层的启动类加载器(Bootstrap ClassLoader) -> 如果父类加载器可以完成类加载任务,就成功返回,否则,子类加载器再去尝试类加载任务

3、JVM双亲委派类加载思想的设计目的

这种机制保证了类加载的唯一性和安全性,既防止了核心类库被篡改,也避免了类的重复加载问题。

4、双亲委派的类加载机制能否被打破?

可以。

比如java的SPI机制。传统的双亲委派模型中,类加载器遵循从上到下的委托机制,即父类加载器优先加载类。但在SPI机制中,存在一个特殊场景:

SPI接口通常由启动类加载器加载(如JDK核心库中的接口);

SPI实现类通常由系统类加载器或自定义类加载器加载(如第三方jar包中的实现)。

所以,在SPI机制中,需要加载SPI接口实现类的时候,会使用线程上下文类加载器加载,而不是按照双亲委派的顺序。SPI机制实际上属于逆向委派,也就是父类加载器(Bootstrap类加载器)请求子类加载器(应用类加载器)完成类加载的行为。

Java中的类加载过程、双亲委派和模型打破场景

三、类加载器分类

JVM包括4种类加载器。

1、启动类加载器(Bootstrap ClassLoader):负责加载Java核心类库

2、扩展类加载器(Extension ClassLoader):负责加载Java的扩展类库

3、应用程序类加载器(Application ClassLoader):负责加载应用程序类路径下的类,是默认的类加载器

4、用户自定义类加载器:我们可以通过实现java.lang.ClassLoader并重写findClass方法来创建自定义的类加载器,用来实现特定类的加载任务


查看详情:https://www.toutiao.com/article/7609892973953778219
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2026-2-24 07:16 , Processed in 0.039226 second(s), 17 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

返回顶部