大白话解释什么类加载机制

大家好,我是伍六七。

今天我们来聊聊一个 Java 面试必考基础题目:类加载机制和双亲委派机制。

Java 类的加载机制是 Java 虚拟机(JVM)中类加载(Class Loading)和链接(Linking)的过程的一部分。这个过程遵循以下步骤:

1、加载(Loading): 这是第一步,其中 JVM 会通过类的全名找到这个类的二进制数据流,并从这个数据流中构造出一个 Class 对象。

2、链接(Linking): 链接过程包含验证(Verify)、准备(Prepare)和解析(Resolve)三个阶段。

  • 验证: 确保被加载的类符合 JVM 规范。
  • 准备: 为类的静态变量分配内存,并将其初始化为默认值。
  • 解析: 虚拟机将类中的符号引用转换为直接引用。

3、初始化(Initialization): 这个阶段是执行类构造器 <clinit>() 方法的过程,这个方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。

Java 类加载机制的核心是双亲委派模型

在这个模型中,一个类加载器在加载类时,首先会请求其父类加载器加载该类,依此类推,直到顶层的启动类加载器。如果父类加载器无法完成这个加载任务(即它没有找到对应的类),子类加载器才会尝试自己去加载这个类。

这句话,我们经常看到,那什么意思呢?用大白话告诉你:

我们需要知道,默认情况,Java 提供了以下三类类加载器:

1、启动类加载器(Bootstrap ClassLoader):

这是类加载器层级结构中的最顶层加载器。
它负责加载 JVM 的核心类库,如 java.lang.*。

2、扩展类加载器(Extension ClassLoader):

它是启动类加载器的子类。
负责加载 Java 的扩展类库,这些类库通常位于 jre/lib/ext 目录或由系统属性 java.ext.dirs 指定的任何其他目录中。

3、应用程序类加载器(Application ClassLoader):

这是扩展类加载器的子类。

它负责加载环境变量 classpath 或系统属性 java.class.path 指定路径中的类。

这种机制有助于防止类的重复加载,并保证了 Java 核心库的类型安全。

详细解释具体流程

1、类加载请求的初始处理

当一个类加载器(比如应用程序类加载器)接收到一个请求,用来加载一个特定的类时,它并不会立即尝试去加载这个类

2、委派给父类加载器

代替自行加载,这个类加载器会将加载请求向上委派给它的父类加载器。例如,应用程序类加载器会先将请求委派给扩展类加载器,扩展类加载器再将请求委派给启动类加载器

3、父类加载器的处理

父类加载器(在这个例子中是启动类加载器)会尝试加载这个类。启动类加载器主要负责加载 Java 的核心类库(例如 java.lang.*)。

如果它能够找到并加载这个类,那么加载过程到此结束,子类加载器不会再进行任何操作。

4、父类加载器无法加载时的回退

如果父类加载器(比如启动类加载器)无法加载该类(通常是因为它在其搜索路径下没有找到相应的类),那么它会将请求回退给请求它的子类加载器(在这个例子中是扩展类加载器)。

接着,扩展类加载器会尝试自己去加载这个类。如果扩展类加载器也无法加载这个类,同样的过程会发生在它和它的子类加载器(应用程序类加载器)之间。

5、保障类加载的有序性和安全性

这种委派机制确保了 Java 核心类库的类型不会被随意替换,因为自定义的类加载器无法替换那些由启动类加载器加载的核心类库

同时,它也避免了类的重复加载,因为在尝试自行加载类之前,每个类加载器都会先检查它的父类加载器是否已经加载了该类。

通过这种方式,双亲委派模型为 Java 类的加载提供了一种层次化和有序的方法,保证了类加载机制的健壯性和安全性。

扫描下面二维码,加我好友,一起交流技术。

学会了嘛?学会了帮我点一下在看或转发,欢迎关注我的公众号

关注我,送你全套我整理的 Java 岗位面试资料。这是我自己之前整理的面试题,靠着这份面试题,我从 30 人的小公司,进了 2000 人+的央企子公司,之后又进了互联网大厂。

一份让我进大厂&央企的面试题

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

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

相关文章

LeetCode27.移除元素(暴力法、快慢指针法)

每日一题&#xff1a;LeetCode27.移除元素 1.问题描述2.解题思路3.代码 1.问题描述 问题描述&#xff1a;给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必…

【开题报告】基于微信小程序的个人健康管理系统的设计与实现

1.选题背景与意义 在现代社会&#xff0c;人们对健康的关注日益增加。随着生活方式的变化和工作压力的增加&#xff0c;许多人意识到保持良好的身体健康对于提高生活质量和幸福感的重要性。 然而&#xff0c;许多人在日常生活中缺乏对自身健康状况的了解和管理。他们可能没有…

有趣的按钮分享

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 广告打完&#xff0c;我们进入正题&#xff0c;先看效果&#xff1a; 废话不多&#xff0c;上源码&#xff1a; <button class&quo…

租赁小程序|租赁系统一种新型的商业模式

租赁市场是一个庞大的市场&#xff0c;它由出租人和承租人组成&#xff0c;以及相关的中介机构和供应商等。随着经济的发展和人们对灵活性的需求增加&#xff0c;租赁市场也在不断发展和壮大。特别是在共享经济时代&#xff0c;租赁市场得到了进一步的推动和发展。租赁系统是一…

如何在Docker部署Draw.io绘图工具并远程访问

文章目录 前言1. 使用Docker本地部署Drawio2. 安装cpolar内网穿透工具3. 配置Draw.io公网访问地址4. 公网远程访问Draw.io 前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软件为收费&#xff0…

11 月 11 日 ROS 学习笔记——ROS 架构及概念

文章目录 前言一、 ROS 文件系统级1). 工作空间 Ws2). 功能包3). 消息 msg4). 服务 srv 二、计算图级1). 动态加载节点 nodelet2). 主题 topic3). 服务 srv4). 消息 msg5). 试用练习5). 创建工作空间6). 创建 ROS 功能包和元功能包7). 编译ROS功能包8). 使用 ROS 节点9). 使用主…

基于 gin + websocket 即时通讯项目 (一、项目初始化)

基于 gin websocket 即时通讯项目 1、安装环境与初始化 搜索各种包官网 https://pkg.go.dev/ 1.1 安装 grom go get -u gorm.io/grom 1.2 安装 MySQL 驱动 go get -u gorm.io/driver/sqlite go get -u gorm.io/driver/mysql 1.3 安装 gin go get -u github.com/gin-gonic/gi…

中小企业怎么实现数字化转型?有什么实用的工单管理系统?

当前&#xff0c;世界经济数字化转型已是大势所趋。在这个数字化转型的大潮中&#xff0c;如果企业仍然逆水而行&#xff0c;不随大流&#xff0c;那么&#xff0c;企业将有可能会被抛弃&#xff0c;被对手超越&#xff0c;甚至被市场边缘化&#xff0c;导致最终的结果是&#…

C //例 8.22 用函数求整数a和b中的大者。

C程序设计 &#xff08;第四版&#xff09; 谭浩强 例 8.22 例 8.22 用函数求整数a和b中的大者。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块 方法&#xff1a;使用指针、函数指针、动态分配内存 #include <stdio.h> #include <…

亚马逊云科技帮助客户在云中构建具有高可靠性和韧性的应用程序

在一个理想的世界里&#xff0c;一切都非常完美&#xff0c;并且一直都在顺畅运作。早晨的通勤没有交通堵塞&#xff0c;最喜欢的停车位一直空着&#xff0c;一杯温度适宜的饮料&#xff0c;生活一帆风顺&#xff0c;没有任何中断。在需要时&#xff0c;您能得到所需的东西。但…

webview页面使用有哪些要求

使用WebView页面有以下要求&#xff1a; 确认是否需要用户授权&#xff1a;如果WebView要访问设备上的敏感信息或执行危险操作&#xff0c;应该给用户一个明确的授权提示&#xff0c;让用户知道WebView正在执行的操作。 确认WebView的配置&#xff1a;使用WebView时&#xff0…

【项目】云备份系统基础功能实现

目录 一.项目介绍1.云备份认识2.服务端程序负责功能与功能模块划分3.客户端程序负责功能与功能模块划分4.开发环境 二.环境搭建1.gcc升级7.3版本2.安装jsoncpp库3.下载bundle数据压缩库4.下载httplib库 三.第三方库认识1.json(1)json认识(2)jsoncpp认识(3)json实现序列化(4)jso…

医疗项目的需求分析以及开发流程

一.项目的背景以及需求 1.项目背景 1.政策层面来看&#xff0c;近年来我国政府相关部门陆续颁发了支持数字医疗行业发展的相关政策&#xff0c;“互联网医疗”政策逐渐明确完善&#xff0c;为数字医疗行业发展提供支持&#xff0c;行业迎来政策福利期。 其次&#xff0c;从经济…

2021年3月青少年软件编程(Python)等级考试试卷(一级)

2021年3月青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09;二、判断题&#xff08;共10题&#xff0c;每题…

计算机毕业设计选题推荐-高校后勤报修微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

实时人眼追踪、内置3D引擎,联想ThinkVision裸眼3D显示器创新四大应用场景

11月17日&#xff0c;在以“因思而变 智领未来”为主题的Think Centre和ThinkVision 20周年纪念活动上&#xff0c;联想正式发布了业内首款2D/3D 可切换裸眼3D显示器——联想ThinkVision 27 3D。该产品首次将裸眼2D、3D可切换技术应用在显示器领域&#xff0c;并拓展了3D技术多…

IPKISS Tutorials 1------导入 pdk

IPKISS Tutorials 1------导入 pdk 方法1方法2今天给大家介绍一下如何在 IPKISS 中导入想要使用的 pdk 文件。 方法1 # 导入IPKISS 自带 si_fab PDK from si_fab import all as pdk # 导入amf PDK from amfsip import all as pdk方法2 # 导入IPKISS 自带 si_fab PDK import …

【cpolar】搭建我的世界Java版服务器,公网远程联机

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;cpolar&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 前言&#xff1a; 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 2. 测试局域网联机 3. 公网远程联机 3.1 安…

2023年09月青少年软件编程(C语言)等级考试试卷(四级)

青少年软件编程&#xff08;C语言&#xff09;等级考试试卷&#xff08;四级&#xff09; 酒鬼 Santo刚刚与房东打赌赢得了一间在New Clondike 的大客厅。今天&#xff0c;他来到这个大客厅欣赏他的奖品。房东摆出了一行瓶子在酒吧上。瓶子里都装有不同体积的酒。令Santo高兴…

人工智能:科技的魔术师

引言&#xff1a; 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;作为一项前沿技术&#xff0c;正以惊人的速度改变着我们的生活。它像魔术师一样&#xff0c;能够解决我们的问题、提供建议&#xff0c;甚至预测未来。从智能手机到智能家居&…