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

news2024/9/21 15:17:13

大家好,我是伍六七。

今天我们来聊聊一个 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.coloradmin.cn/o/1229343.html

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

相关文章

大学生如何免费认证,下载,安装MATLAB

下载 打开学校图书馆官网 选择版本后&#xff0c;点击下载 注册绑定个人认证 前提&#xff01;需要有学校邮箱【以edu.cn结尾的】 进入mathworks官网 注册账户 安装 下载完后&#xff0c;打开 选择&#xff1a;setup 安装程序 勾选&#xff1a;是&#xff1b;选择&#xf…

【汇编】数据在哪里?有多长、div指令实现除法、dup设置内存空间

文章目录 前言一、汇编语言中数据位置的表达1.1 汇编中有哪几种数1.立即数&#xff08;idata&#xff09;&#xff1a;2.寄存器&#xff08;Register&#xff09;&#xff1a;3.内存&#xff08;Memory&#xff09;&#xff1a;4.段地址&#xff08;Segment Address&#xff0c…

卫生纸标准及鉴别

一、标准分类及含义 &#xff08;1&#xff09;标准分类 ①GB——国家强制标准&#xff08;即最低标准&#xff09; ②GB/T——国家推荐标准 ③QB——轻工行业标准 ④QB/T——轻工行业推荐标准 &#xff08;2&#xff09;含义 ①国家标准是指国家标准化主管机构批准发布的。…

RT-DETR优化改进:SEAM、MultiSEAM分割物与物相互遮挡、分割小目标性能

🚀🚀🚀本文改进:SEAM、MultiSEAM分割物体与物体相互遮挡性能 🚀🚀🚀SEAM、MultiSEAM分割物与物相互遮挡、分割小目标性能 🚀🚀🚀RT-DETR改进创新专栏:http://t.csdnimg.cn/vuQTz 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; RT-DETR模型创新…

[和ChatGPT学编程]Python Requests 简介

requests 是一个流行的 Python 库&#xff0c;用于发送 HTTP 请求。它提供了简洁而友好的 API&#xff0c;使得发送 HTTP 请求变得简单而直观。requests 具有许多强大的功能&#xff0c;适用于各种 HTTP 请求场景&#xff0c;包括 GET、POST、PUT、DELETE 等。 目录 requests 库…

Tomcat 启动 HTTP状态 404 - 未找到

Tomcat 启动 HTTP状态 404 - 未找到 tomcat启动的项目访问地址实际是根据应用程序上下文的目录来决定的&#xff0c;而不是服务器那边配置的URL的地址来决定的

nginx学习(3)Nginx 负载均衡

Nginx 负载均衡 实战案例 实现效果 浏览器地址栏输入地址 http://172.31.0.99/oa/a.html&#xff0c;负载均衡效果&#xff0c;平均在 8083 和 8084 端口中&#xff0c;刷新浏览器&#xff0c;显示不同 一、配置 1、先创建2个文件夹tomcat8083和tomcat8084&#xff0c;并将…

JSP 四大域对象

我们来说说JSP的四大域对象 首先 我们要了解他们是四种保存范围 第一种 是 Page范围 只作用于当前界面 只要页面跳转了 其他页面就拿不到了 第二种 request范围 在一次请求中有效 就是 我们服务端指向某个界面 并传递数据给他 那么 如果你是客户端跳转就不生效了 第三种 sessi…

internet download manager2024中文绿色版(IDM下载器)

在现代互联网时代&#xff0c;文件下载已经成为我们日常生活中必不可少的一项技能。无论是下载软件、音乐、视频还是其他文件&#xff0c;一个高效的下载方法能够为我们节省时间和精力。本文将为您提供一份简明扼要的下载教程&#xff0c;让您轻松掌握文件下载的技巧。 intern…

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;每题…

vue2通信方法(最全)

前言 数据传递是框架的核心要素之一,也是在业务开发中极其重要的技术.熟练掌握所有的通信方法,是开发者必须具备的技能。 这篇文章我将会把vue2所有的通信的方法都形成简单易懂的demo。 在我的分类中,通信方法有两种大类型: 1.vue框架提供的通信方法 2.插件及其他通信方法…

指针学习(五)

一.函数指针数组 定义&#xff1a;函数指针放进数组中&#xff0c;就叫函数指针数组&#xff0c;准确的说&#xff0c;将一个函数的地址存到⼀个数组中 那这个数组就叫函数指针数组。 int (*pi[5])(int); 解读&#xff1a;pi先和[]结合&#xff0c;因此是数组&#xff0c;加i…

Leetcode—5.最长回文子串【中等】

2023每日刷题&#xff08;三十五&#xff09; Leetcode—5.最长回文子串 中心扩展法算法思想 可以使用一种叫作“中心扩展法”的算法。由回文的性质可以知道&#xff0c;回文一定有一个中心点&#xff0c;从中心点向左和向右所形成的字符序列是一样的&#xff0c;并且如果字符…

Threejs_04 gui调试开发

threejs的快捷调试工具就是这玩意&#xff0c;那么如何使用呢&#xff1f;&#xff1f; 使用gui调试开发 引入gui实例 //导入lil.gui // import * as dat from "dat.gui"; // 旧 import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";…

Vatee万腾科技创新之舟:Vatee数字化力量引领未来的独特路径

在数字化的大潮中&#xff0c;Vatee万腾如一艘科技创新之舟&#xff0c;在未来的海洋中翱翔。vatee万腾以强大的数字化力量为桨&#xff0c;引领着行业向着新的、独特的路径前行&#xff0c;塑造着数字时代的未来。 Vatee万腾不仅仅是一家科技公司&#xff0c;更是一艘创新之舟…

数据结构与算法编程题2

逆置线性表&#xff0c;使空间复杂度为 O(1) #include <iostream> using namespace std;typedef int ElemType; #define Maxsize 100 #define OK 1 #define ERROR 0 typedef struct SqList {ElemType data[Maxsize];int length; }SqList;void Init_SqList(SqList& …

外贸人如何向国外客户展现我们的合作诚意

最近听直播&#xff0c; 一个小伙伴说自己在国外找了一个合作伙伴&#xff0c; 让他代表自己的公司和当地的客户沟通&#xff0c;然后给对方结算佣金&#xff0c;虽然对方口头答应好好的&#xff0c;但是好像做事情并不用心的样子。 比如自己之前去他们当地设展的时候邀请对方…

MAX/MSP SDK学习01:Object的基本构成、创建销毁行为函数的定义、属性的赋值、以及相关注意事项

Object的基本构成、创建&销毁&行为函数的定义、属性的赋值、以及相关注意事项。 #include "ext.h" // standard Max include, always required #include "ext_obex.h" // required for new style Max object// object struct&#xff0c;定义属…

ruoyi-vue前后端分离版本验证码实现思路

序 时隔三个月&#xff0c;再次拿起我的键盘。 前言 ruoyi-vue是若依前后端分离版本的快速开发框架&#xff0c;适合用于项目开始搭建后台管理系统。本篇文章主要介绍其验证码实现的思路。 一、实现思路简介 1、后端会生成一个表达式&#xff0c;比如1 2 ? 3&#xff0…

Django 入门学习总结2

通过学习&#xff0c;我们可以实现一个简单的投票系统。这个投票系统有两部分组成。 公共部分&#xff0c;公众可以查看和进行投票。管理员可以进行增加、删除、修改投票信息。 这里投票系统Python语言版本为3.10.13&#xff0c;Django Web框架版本为4.2.7。 投票系统的实现…