Java的类加载过程

server/2025/2/3 9:38:02/

类加载就是把类(通常是.class文件的形式)通过类加载器加载到 JVM 中,经过一系列的解析成可用的 class 类

二进制流的来源可能有:

  1. 编译后的.class文件

  2. 使用ASM、ByteBuddy等字节码生成工具创建的字节码

  3. 甚至可以从网络传输得到,只要它符合Java字节码的格式,JVM都能够接受并处理。

类加载过程

类加载流程分为加载、链接、初始化三个阶段,连接还能拆分为 : 验证、准备、解析三个阶段:

  • 加载 : 类加载器将二进制流读到内存,并生成Class对象,作为方法区这个类的各种数据的访问入口

  • 链接 - 细分为三个子阶段:

    • 验证 : 主要验证加载进来的二进制流是否符合一定格式,类文件的结构是否符合Java规范等。

    • 准备 : 为类的静态变量在方法区分配内存并赋初值(如 int 的初值为 0)这时还未执行任何Java代码

    • 解析

      • 将常量池的类、接口、字段和方法等符号引用转换为直接引用(内存地址)

      • 符号引用可以理解为只是个替代的标签,比如你此时要做一个计划,暂时还没有人选,你暂定A去做这件事。等计划真正落地时肯定要找到确定的人选,比如小明去做这件事。解析就是把 A(符号引用)替换成小明(直接引用)

      • 直接引用指的是一个真实引用,在内存中可以通过这个引用找到目标

  • 初始化 :

    • JVM负责执行类的初始化代码,为类变量赋予程序员期望的正确初始值

    • 也就是执行类构造器<clinit>()方法的过程。这个方法是由编译器自动生成,收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。准备阶段设置初始值只是占个坑

补充知识点

Java初始化的加载顺序

父类静态成员变量==>父类静态代码块(构造函数就是在代码块里)==>子类静态成员变量==>子类静态代码块 ==>

父类非静态成员变量==>父类非静态代码块==>父类构造函数==>子类非静态成员变量==>子类非静态代码块==>子类构造函数

类加载器

类加载的过程是由类加载器来完成的,Java提供了以下几种类加载器 :

  • 启动类加载器(Bootstrap ClassLoader) : 用于加载Java核心库,如rt.jar

  • 扩展类加载器(Extension ClassLoader) : 用于加载Java的扩展库

  • 应用程序类加载器(Application ClassLoader) : 用于加载用户类路径(Classpath)上的类库

  • 自定义类加载器(User Custom ClassLoader) : 用户可以继承java.lang.ClassLoader来实现自定义的类加载器,如从网络加载类文件等

类加载器之间存在层次关系,当一个类加载器尝试加载一个类时,它会遵循委托模型,首先尝试让父类加载器加载该类,只有当父类加载器无法加载时,才会尝试自己加载


http://www.ppmy.cn/server/164577.html

相关文章

[c语言日寄]assert函数功能详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

一文掌握ADB的安装及使用

文章目录 一、什么是ADB&#xff1f;二、 安装ADB2.1 下载ADB2.2 配置环境变量 三、连接Android设备四、 常用ADB命令五、ADB高级功能5.1 屏幕截图和录制5.2 模拟按键输入5.3 文件管理5.4 系统设置管理5.5 系统操作指令5.6 日志操作指令5.7 APK操作指令5.8 设备重启和恢复 六、…

C++ 中用于控制输出格式的操纵符——setw 、setfill、setprecision、fixed

目录 四种操纵符简要介绍 setprecision基本用法 setfill的基本用法 fixed的基本用法 setw基本用法 以下是一些常见的用法和示例&#xff1a; 1. 设置字段宽度和填充字符 2. 设置字段宽度和对齐方式 3. 设置字段宽度和精度 4. 设置字段宽度和填充字符&#xff0c;结合…

Java 网络原理 ②-IP协议

这里是Themberfue 经过五节课的传输层协议的讲解&#xff0c;接下来我们将进入网络层协议——IP协议的讲解了~~~ IP协议 IP 相信大家在日常生活中或多或少都听过&#xff0c;你的IP地址是什么&#xff1f;192.168.0.1 ......✨IP 其实是个网络层协议&#xff0c;即互联网协议&…

【算法】回溯算法专题② ——组合型回溯 + 剪枝 python

目录 前置知识进入正题小试牛刀实战演练总结 前置知识 【算法】回溯算法专题① ——子集型回溯 python 进入正题 组合https://leetcode.cn/problems/combinations/submissions/596357179/ 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以…

电脑要使用cuda需要进行什么配置

在电脑上使用CUDA&#xff08;NVIDIA的并行计算平台和API&#xff09;&#xff0c;需要进行以下配置和准备&#xff1a; 1. 检查NVIDIA显卡支持 确保你的电脑拥有支持CUDA的NVIDIA显卡。 可以在NVIDIA官方CUDA支持显卡列表中查看显卡型号是否支持CUDA。 2. 安装NVIDIA显卡驱动…

基于新年视角下的城市人流数据分析

2025年新年~~~ 旅游消费似乎又成为城市活力的动力话题。 透过话题看数据&#xff0c;透过数据看结果&#xff0c;无非是从--人流量--到--人留量&#xff0c;能不能留下人&#xff0c;能否因人而产生消费。 基于这个角度&#xff0c;地方政府经营城市的商业模式本质则是为城市…

数据分析系列--[12] RapidMiner辨别分析(含数据集)

一、数据准备 二、导入数据 三、数据预处理 四、建模辨别分析 五、导入测试集进行辨别分析 一、数据准备 点击下载数据集 二、导入数据 三、数据预处理 四、建模辨别分析 五、导入测试集进行辨别分析 Ending, congratulations, youre done.