JVM学习——类的加载器以及类的加载过程

类加载器以及类的加载过程可分为三个阶段。

1、加载(引导类,扩展类,系统类)

2、链接(验证,准备,解析)

3、初始化

类加载系统只负责class的加载,不负责是否可以正常运行,运行是由ExecutionEngine决定的。

加载到的类信息存放在方法区中(JDK8以后改名了),此外也会存一些常量的信息,都是加载的class类中的。

1、加载

加载先通过一个class文件的名的二进制字节流读取,并将这个字节流所代表的数据结构在方法区中构建。

之后生成一个该类的Class对象,用于以后的访问接口。

bash 复制代码
类加载的方式:
1、从本地系统中加载
2、通过网络获取:Web Applet
3、从zip文件中读取,后续有jar、war
4、运行时计算读取:动态代理
5、其他文件生成:JSP
6、从专有数据库中提取
7、从加密文件路径中提取

2、链接

阶段一:验证,主要在于验证class文件是否符合规范,保证正确性。主要有:文件格式验证、元数据验证、字节码验证、符号引用验证。

阶段二:准备,为类的变量进行默认值赋值。(final修饰的静态变量自动分配配置好的值)这里不进行初始化操作。

阶段三:解析,将class中的符号和常量池中的引用对应上,还有一些接口、字段、类方法、接口方法、方法类型等等。一般伴随着JVM执行完初始化后执行。

3、初始化

执行<clinit>方法,该方法是为为类中的赋值动作和静态代码块中的语句进行赋值,执行顺序与代码顺序保持一致。

类的构造器与上述方法不一致,构造器会另外执行。

若该类存在父类,会先进性父类的加载。

虚拟机会保证一个类的<clinit>在多线程下保持被同步加锁。既只会初始化一个放到内存中保存。


类的加载器分类

在JVM中只有两种分类,分别为引导类加载器和自定义类加载器,简单来说就是C写的就是引导类,Java写的就是自定义类加载器。自定义类加载器有常用的就是扩展类加载器和系统类加载器。

启动类加载器:

1、是C/C++实现的代码

2、用于加载Java的核心类库

3、是扩展类和系统类加载器的父类加载器,注意不是继承关系

4、只加载java,javax,sun等开头的类

扩展类加载器:

1、Java实现

2、诞生于ClassLoader类

3、加载JDK安装目录的jre/lib/ext子目录下的类库,用户也可以将自己的类库放到这个路径下,也会被扩展类加载器加载。

系统类加载器:

1、Java实现

2、负责classpath路径下的类加载

3、是程序默认的加载器


自定义加载器使用场景

1、隔离加载类,比如重名

2、修改加载方式,动态代理

3、多加载源,可能来自于其他地方的类库

4、加密代码

实现方法:

1、继承ClassLoader方法,并实现findClass(String name)方法,用于自定义获取加载路径。

2、这里如果是需要加密代码可以对这个name路径进行解密or加密

3、如果不需要加密,可以直接继承URLClassLoader

相关推荐
来不及辣哎呀8 分钟前
学习Java第六十二天——Hot 100-09-438. 找到字符串中所有字母异位词
java·开发语言·学习
鸿途优学-UU教育32 分钟前
2025搜狐教育年度盛典|UU教育CEO彭普杰:成人学习不止于知识传递,科技赋能背后更需温度守护
科技·学习
后端小张35 分钟前
【TextIn大模型加速器 + 火山引擎】TextIn大模型加速器与火山引擎协同构建智能文档处理新范式
人工智能·学习·数据挖掘·langchain·tensorflow·gpt-3·火山引擎
yuhaiqun19891 小时前
发现前端性能瓶颈的巧妙方法:建立“现象归因→分析定位→优化验证”的闭环思维
前端·经验分享·笔记·python·学习·课程设计·学习方法
d111111111d1 小时前
使用STM32 HAL库配置ADC单次转换模式详解
笔记·stm32·单片机·嵌入式硬件·学习
·present·1 小时前
射频网课学习第0章(绪论)
学习
DYS_房东的猫1 小时前
学习总结笔记三:让网站“活”起来——处理静态文件、表单验证与用户登录(第3章实战版)
笔记·学习·golang
硬件yun2 小时前
Flyback反激电路学习参数计算
学习
mudtools2 小时前
如何设计易维护、低学习成本的飞书.NET SDK组件
学习·.net·飞书
廋到被风吹走2 小时前
【Java】【Jdk】Jdk11->Jdk17
java·开发语言·jvm