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

相关推荐
伶俜667 分钟前
鸿蒙原生应用实战(七)ArkUI 文件管理器:目录浏览 + 文件操作 + 搜索筛选
学习·华为·harmonyos
hunterkkk(c++)18 分钟前
二分图的学习
学习
lihao lihao19 分钟前
linux线程
java·开发语言·jvm
徐子元竟然被占了!!33 分钟前
Git学习
git·学习·elasticsearch
编程圈子1 小时前
电机驱动开发学习1. 直流无刷电机介绍
学习
YM52e1 小时前
鸿蒙PC ArkTS 死亡轮循深度解析与解决方案
学习·华为·harmonyos·鸿蒙·鸿蒙系统
kdxiaojie1 小时前
Linux 驱动研究 —— SPI (2)
linux·运维·笔记·学习
Chris _data1 小时前
# WPF 学习记录( 第二天)
学习·wpf
梦071 小时前
Trae Friends福州线下活动收获一二-vibeCoding现状
经验分享·学习
星恒随风1 小时前
C++ 模板初阶:从泛型编程、函数模板到类模板,一篇打通基础概念
开发语言·c++·笔记·学习