Java类加载机制

类加载机制

  • 类加载机制
    • 类加载的过程
      • 加载(Loading)
      • 验证(Verification)
      • 准备(Preparation)
      • 解析(Resolution)
      • 初始化(Initialization)
    • 类加载器
      • 启动类加载器
      • 扩展类加载器
      • 应用程序类加载器
    • 双亲委派模型

类加载机制

JDK的编译器javac负责将java文件编译成class字节码文件
java负责启动java虚拟机,把字节码文件读取到java虚拟机,由虚拟机同一管理类和对象的信息,类加载就是从字节码文件到对象创建并使用的过程

类加载的过程

加载(Loading)

这是类加载过程的第一步,主要是通过类的全限定名来获取定义此类的二进制字节流。字节流可以从多种来源获取,比如从本地文件系统读取.class文件、从网络下载字节流、从jar文件中提取等
将字节流所代表的静态存储结构转换为方法区中的运行时数据结构。方法区是 JVM 内存区域之一,用于存储已被虚拟机加载的类信息、常量、静态变量等数据
在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。这个Class对象是非常重要的,通过它可以访问类的各种信息,如类的属性、方法等

  • 获取字节流
  • 数据结构转换
  • 生成对应的Class对象

验证(Verification)

确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全

  • 对字节流进行文件格式验证(如检查魔数、主次版本号等是否正确)
  • 元数据验证(如检查类是否有正确的继承关系等)
  • 字节码验证(检查指令是否合法等)
  • 符号引用验证(检查符号引用是否能正确解析等)

如果一个类文件的字节码被恶意篡改,可能在验证阶段就会被检测出来。

准备(Preparation)

为类变量(即被static修饰的变量)分配内存并设置初始值。这里的初始值是指数据类型的默认零值

  • 整型:0
  • 浮点型:0.0
  • 布尔型:false
  • 字符型:空字符
  • 引用型(对象):null

解析(Resolution)

这是虚拟机将常量池内的符号引用替换为直接引用的过程
符号引用:一组符号来描述所引用的目标
直接引用:直接指向目标的指针、句柄等
为了方便在运行时能够直接调用某个方法,一个类中引用了另一个类的方法,在解析阶段就会把这个方法的符号引用转换为直接引用

初始化(Initialization)

执行类构造器方法的过程。方法是由编译器自动收集类中的所有静态变量的赋值动作和静态语句块(static {})中的语句合并产生的。在初始化阶段,会按照语句在源程序中的顺序依次执行这些静态变量赋值和静态语句块中的语句
例如,对于一个有静态变量和静态块的类:

class TEST{// 准备阶段,分配age的内存,由于没有初始值,将默认初始值为0private static final int age; static {// 初始化阶段age = 18;}
}

类加载器

(ClassLoader)

启动类加载器

(Bootstrap ClassLoader)

它是由 C++ 语言实现的,是 JVM 自身的一部分,主要负责加载存放在<JAVA_HOME>\lib目录下的,或者被-Xbootclasspath参数所指定的路径中的,并且是 Java 虚拟机识别的(如rt.jar)类库。它是最顶层的类加载器,加载的类是最基础的、对整个 Java 系统都非常重要的类,如java.lang.Object等基础类

扩展类加载器

(Extension ClassLoader)

它负责加载<JAVA_HOME>\lib\ext目录下的类库,或者被java.ext.dirs系统变量所指定路径中的类库。主要用于加载 Java 的扩展类库,例如一些 Java 的标准扩展功能的类

应用程序类加载器

(Application ClassLoader)

也称为系统类加载器,它负责加载用户类路径(classpath)上的所有类库,是最常用的类加载器。在编写 Java 应用程序时,自己编写的类一般都是由这个类加载器加载的。它可以通过ClassLoader.getSystemClassLoader()方法获取

双亲委派模型

(Parent - Delegation Model)
这是 Java 类加载器的一种层次关系模型。当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把请求委派给父类加载器。如果父类加载器可以完成加载任务,就成功返回;如果父类加载器无法加载(例如它在自己负责的路径下找不到对应的类),子加载器才会尝试自己去加载。
这种模型保证了 Java 核心类库的安全性和一致性,避免了用户自定义的类覆盖 Java 核心类。

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

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

相关文章

【Linux】sed编辑器

一、基本介绍 sed编辑器也叫流编辑器&#xff08;stream editor&#xff09;&#xff0c;它是根据事先设计好得一组规则编辑数据流。 交互式文本编辑器&#xff08;如Vim&#xff09;中&#xff0c;可以用键盘命令交互式地插入、删除或替换文本数据。 sed编辑器是根据命令处理…

嵌入式入门Day40

C Day3 C对C的结构体的扩充类this指针类的大小类中的特殊成员函数构造函数 作业 C对C的结构体的扩充 C语言中的结构体&#xff0c;仅仅只是属性&#xff08;变量&#xff09;的聚合体&#xff0c;不可以在结构体中定义行为&#xff08;函数&#xff09;。如果非要在结构体中定…

《自动驾驶与机器人中的SLAM技术》ch2:基础数学知识

目录 2.1 几何学 向量的内积和外积 旋转矩阵 旋转向量 四元数 李群和李代数 SO(3)上的 BCH 线性近似式 2.2 运动学 李群视角下的运动学 SO(3) t 上的运动学 线速度和加速度 扰动模型和雅可比矩阵 典型算例&#xff1a;对向量进行旋转 典型算例&#xff1a;旋转的复合 2.3 …

C语言教程——指针进阶(1)

目录 前言 1、字符指针 2、指针数组 3、数组指针 3.1数组指针 3.2&数组名VS数组名 3.3数组指针的使用 4、数组参数、指针参数 4.1一维数组传参 4.2二维数组传参 4.3一级指针传参 4.4二级指针传参 4.5总结 5、函数指针 5.1思考 总结 前言 我们在之前知道指针…

[应用类App] 轮廓线 aia源码 UI界面精美,画布实现手柄摇杆

屏幕数量&#xff1a;10个&#xff0c;仅主界面近3000代码块&#xff0c;请自行研究参考。 实现了手柄摇杆功能&#xff0c;界面做的比较好。 下载地址&#xff1a;轮廓线 aia源码 UI界面精美&#xff0c;画布实现手柄摇杆 - .aia 案例源码 - 清泛IT社区&#xff0c;为创新赋能…

C++—9、如何在Microsoft Visual Studio中调试C++

本文通过实例操作来介绍 Visual Studio 调试器的功能。调试器在运行过程中可提供许多方法让你查看代码的情况。 你可以逐步浏览代码、查看变量中存储的值、设置对变量的监视以查看值何时改变、检查代码的执行路径、查看代码分支是否正在运行等等。本实例主要是设置断点及查看内…

SpringBoot项目实战(39)--Beetl网页HTML文件中静态图片及CSS、JS文件的引用和展示

使用Beetl开发网页时&#xff0c;在网页中使用的CSS、JS、图片等静态资源需要进行适当的配置才可以展示。大致的过程如下&#xff1a; &#xff08;1&#xff09;首先Spring Security框架需要允许js、css、图片资源免授权访问。 &#xff08;2&#xff09;网站开发时&#xff0…

GetMaterialApp组件的功能与用法

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性3. 示例代码4. 内容总结我们在上一章回中介绍了"Get包简介"相关的内容,本章回中将介绍GetMaterialApp组件.闲话休提,让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经介绍过GetMaterialApp组…

插入实体自增主键太长,mybatis-plaus自增主键

1、问题 spring-boot整合mybtais执行insert语句时&#xff0c;主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2&#xff09;数据库主键的种子值设置的多少 3、解决问题 1&#xff09;数据库主键设置的时自增 3&#xff09;种子值是1 所以排查是数据库的问题 4、继…

【嵌入式硬件】嵌入式显示屏接口

数字显示串行接口&#xff08;Digital Display Serial Interface&#xff09; SPI 不过多赘述。 I2C-bus interface 不过多赘述 MIPI DSI MIPI (Mobile Industry Processor Interface) Alliance, DSI (Display Serial Interface) 一般用于移动设备&#xff0c;下面是接口…

(STM32笔记)十二、DMA的基础知识与用法 第三部分

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验&#xff08;1&#xff09;DMA结构体解释&#xff08;2…

MySQL 如何赶上 PostgreSQL 的势头?

原文地址 我与 MySQL 社区的前辈交谈时&#xff0c;经常遇到这个问题&#xff1a;「为什么 MySQL 这么棒&#xff0c;而且&#xff08;至少根据 DB-Engines 的计算&#xff09;仍然比 PostgreSQL 更流行&#xff1b;但它的地位在下降&#xff0c;PostgreSQL 却势不可挡地越来越…

完全二叉树的删除

&#xff08;1&#xff09;删除叶子节点 找到要删除的节点 targetNode找到要删除节点的父节点parent&#xff08;父节点是否存在&#xff09;要删除的节点是父节点的左子树还是右子树如果是左子树&#xff0c;则parent.leftnull;如果是右子树则parent.rightnull。 &#xff08;…

Docker入门之docker基本命令

Docker入门之docker基本命令 官方网站&#xff1a;https://www.docker.com/ 1. 拉取官方镜像并创建容器&#xff08;以redis为例&#xff09; 拉取官方镜像 docker pull redis# 如果不需要添加到自定义网络使用这个命令&#xff0c;如需要&#xff0c;直接看第二步 docker r…

玩转大语言模型——ollama导入huggingface下载的模型

ollama导入huggingface模型 前言gguf模型查找相关模型下载模型 导入Ollama配置参数文件导入模型查看导入情况 safetensfors模型下载模型下载llama.cpp配置环境并转换 前言 ollama在大语言模型的应用中十分的方便&#xff0c;但是也存在一定的问题&#xff0c;比如不能使用自己…

DFS之迭代加深、双向DFS、IDA*

迭代加深 迭代加深&#xff1a; 170. 加成序列 满足如下条件的序列 X X X&#xff08;序列中元素被标号为 1 、 2 、 3 … m 1、2、3…m 1、2、3…m&#xff09;被称为“加成序列”&#xff1a; X [ 1 ] 1 X[1]1 X[1]1 X [ m ] n X[m]n X[m]n X [ 1 ] < X [ 2 ] < …

Ansible之批量管理服务器

文章目录 背景第一步、安装第二步、配置免密登录2.1 生成密钥2.2 分发公钥2.3 测试无密连接 背景 Ansible是Python强大的服务器批量管理 第一步、安装 首先要拉取epel数据源&#xff0c;执行以下命令 yum -y install epel-release安装完毕如下所示。 使用 yum 命令安装 an…

【Linux网络编程】第二十二弹---深入理解 I/O 多路转接之 epoll:系统调用、工作原理、代码演示及应用场景

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、I/O 多路转接之 epoll 1.1、epoll 初识 1.2、epoll 的相关系统调用 1.2.1、epoll_create 1.2.2、epol…

双向列表的实现(C++)

一.实现思路 主要是一个空间存储一个数值&#xff0c;然后为了索引后面的数据单元和前面的数据单元&#xff0c;所以在每个空间里面还要存储前面和后面数据单元的指针&#xff0c;就形成了每个数据单元 后面就是要管理的是双向列表的头结点和尾节点&#xff0c;方便实现后面的头…

国产信创实践(国能磐石服务器操作系统CEOS +东方通TongHttpServer)

替换介绍&#xff1a; 国能磐石服务器操作系统CEOS 对标 Linux 服务器操作系统&#xff08;Ubuntu, CentOS&#xff09; 东方通TongHttpServer 对标 Nginx 负载均衡Web服务器 第一步&#xff1a; 服务器安装CEOS映像文件&#xff0c;可直接安装&#xff0c;本文采用使用VMware …