常见面试题-双亲委派模型

news2024/11/15 18:21:41

双亲委派模型

class 文件是通过 类加载器 装在到 JVM 中的,为了防止内存中存在多份同样的字节码,使用了双亲委派模型

双亲委派模型对于保证 Java 程序的稳定运行至关重要

双亲委派模型的原理为:

(1)如果一个类加载器收到了类加载请求,会先将请求委托给父类的加载器去执行

(2)如果父类加载器还存在父类,则继续向上委托,直至到达顶层的引导类加载器

(3)如果父类加载器可以完成类加载,就返回;否则,子类加载器才会尝试自己去加载

双亲委派模型演示:

  1. 创建一个java.lang包,包下创建一个String类
  2. 我们来测试创建String对象的时候加载的是系统的String类,还是我们创建的String类

在这里插入图片描述

package java.lang;

// 自己创建的java.lang.String类
public class String {
   static {
      System.out.println("我是自己创建的String类中的静态代码块!");
   }
}

package com.qy;

// 测试类
public class StringTest {
   public static void main(String[] args) {
      String str = new String();
      /**
      测试结果:并没有输出,说明加载的是系统中的String类,而不是自定义的
      */
   }
}

那么为什么加载的不是自定义的String类呢?

根据双亲委派的工作原理,加载 String 类的时候,系统类加载器收到了类加载的请求,会向上委托给扩展类加载器,扩展类加载器会再向上委托给引导类加载器引导类加载器会加载java包下的类,因此 String 类由引导类加载器加载,所以不会加载自定义的 String 类。

如果需要加载 StringTest 类的话,会一直向上委派到引导类加载器,但是该加载器并不加载 StringTest 类,所以最终仍然由系统类加载器完成对 StringTest 类的加载。

使用双亲委派模型的优势是什么呢?

  • 避免类的重复加载
  • 可以保护程序安全,防止核心 API 被随意篡改(如上例中我们自定义 java.lang.String 类,如果没有双亲委派机制,导致加载了我们自定义的 String 类,会导致程序不安全)

扩展:类加载器的分类

虚拟机默认提供了 3 个类加载器,为:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)、应用程序类加载器(Application ClassLoader)

除了这三种类加载器之外,还有一种用户自定义类加载器(User Defined ClassLoader)

在这里插入图片描述

查看类加载器层级关系:

public class ClassLoaderTest {
   public static void main(String[] args) {

      // 获取系统类加载器
      ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
      System.out.println(systemClassLoader); // sun.misc.Launcher$AppClassLoader@18b4aac2

      // 获取其上层:扩展类加载器
      ClassLoader extClassLoader = systemClassLoader.getParent();
      System.out.println(extClassLoader); // sun.misc.Launcher$ExtClassLoader@1b6d3586

      // 获取其上层:获取不到引导类加载器
      ClassLoader bootstrapClassLoader = extClassLoader.getParent();
      System.out.println(bootstrapClassLoader); // null

      // 对于用户自定义类来说:默认使用系统类加载器进行加载
      ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
      System.out.println(classLoader); // sun.misc.Launcher$AppClassLoader@18b4aac2

      // String类使用引导类加载器进行加载的 ---> java的核心类库都是使用引导类加载器进行加载的
      ClassLoader classLoader1 = String.class.getClassLoader();
      System.out.println(classLoader1); // null
   }
}

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

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

相关文章

淘宝店铺订单插旗接口(taobao.trade.memo.update淘宝店铺订单交易备注修改接口)

淘宝店铺订单插旗接口是指可以在淘宝店铺的订单系统中进行订单备注的接口。通过该接口,您可以根据用户的身份(买家或卖家),添加相应的交易备注,用于区分不同订单类型等。 具体使用方法可以参考淘宝开放平台的API接口文…

欧洲大学专场黑客松,获奖者们在Sui上构建链上物品验证并改进荷兰拍卖

在由区块链学生协会(Blockchain Student Association)与Sui合作的黑客松上,获奖者们构建了旨在吸引新用户并弥合区块链技术与实物资产之间差距的项目。这些新项目展示了Sui的发展前景和灵活性,以及它如何解决现实世界的问题。 来…

深度学习 大数据 股票预测系统 - python lstm 计算机竞赛

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 🔥 优质竞赛项目系列,今天…

Linux常用的压缩命令

笑小枫的专属目录 少整花活,直接干货Linux gzip命令语法功能参数 Linux zip命令语法参数 少整花活,直接干货 本文的来源就是因为上篇文章Linux常用的解压命令,解压整了,顺手整理了一波压缩命令。 Linux gzip命令 减少文件大小有…

Linux常用的解压命令

笑小枫的专属目录 整啥幺蛾子Linux tar命令tar命令的参数范例 Linux unzip命令语法参数 整啥幺蛾子 今天在linux解压一个文件,顺手就来tar -zxvf xxxx ,哦吼,爆竿了,套他猴子的。 好吧,承认 .gz文件解压多了&#xff…

运行程序报错 system/bin/linker: No such file or direct

使用CLion写了一个测试程序, cmake 编译完成后 , ./test 运行程序报错system/bin/linker: No such file or direct 解决 修改编译链接工具链 重新编译后运行正常

9.25 广读论文 思想汇总

数据集MIMIC-VI Learning Patient Static Information from Time-series EHR and an Approach for Safeguarding Privacy and Fairness The dataset analyzed in this study can be found in https://physionet.org/content/mimiciv/2.2/ and https://eicu-crd.mit.edu/about/…

微信个人号二次开发之检测好友

简要描述: 检测好友状态 请求URL: http://域名地址/userPrivacySettings 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选…

如何获取1688商品详情,价格,图片

1688是阿里巴巴旗下的B2B电子商务平台,主要面向国内的生产商和批发商。 通过获取到的跨境属性数据,可以了解到商品的跨境属性,例如商品的语言、原产地、适用场景等信息。这些数据可以帮助用户更好地了解商品的特点和质量,做出更明…

在VM ware上安装ESXI,并ESXI上安装centos系统

在VM ware上安装ESXI,并ESXI上安装centos系统 文章目录 在VM ware上安装ESXI,并ESXI上安装centos系统1.ESXI8.0镜像下载:1.1. 下载ESXI镜像: 2.下载镜像后安装ESXI虚拟机2.1.创建虚拟机 3.开启ESXI的虚拟机开启安装ESXI操作系统4.…

眼镜店展示预约小程序的作用是什么

电子产品深入人们生活以及用眼习惯不好,我国各年龄阶段近视率不低,眼镜店的需求很高,太阳镜、远近视镜等每天都有客户前往验光或配镜等。对眼镜店来说,除了承接线下流量外,还需要外部不断拓展客户,增加营收…

idea 插件推荐第二期

文章目录 便捷开发CodeGlance Pro (代码缩略图)GenerateAllSetter(快速生成对象所有set方法)GsonFormatPlus:json转实体RestfulToolkitX(找到controller快捷请求接口) 美化activate-power-mode-x (敲击计数、动效)Nyan…

Sui主网升级至V1.13.0版本

Sui主网现已升级至V1.13.0版本,同时Sui协议升级至30版本。其他升级要点如下所示: #14348 在运行Prover时,现在会打印有关Sui当前Move Prover支持水平的警告。 #13639 加强验证节点保护机制,防止在以下情况发生时接受交易&…

centos7通过pip3在线下载python3第三方依赖包

更新pip pip3 install --upgrade pip安装requests ​ pip3 install requests -i https://pypi.doubanio.com/simple ​ 安装路径: /usr/local/lib/python3.6/site-packages 安装paho-mqtt ​ pip3 install paho-mqtt -i https://pypi.doubanio.com/simple ​ 安装…

Swift--基本运算符与程序流程控制

系列文章目录 第一章:量值与基本数据类型 第二章:字符、字符串与集合类型 文章目录 系列文章目录空合并运算符区间运算符循环结构while与repeat-while条件循环结构 空合并运算符 可选值类型是Swift语言的一个独特之处,空合并运算符就是针对…

个微协议开发/微信个人号二次开发/ipad协议/api接口

E云管家,是完整的第三方服务平台,并基于IPAD协议8.0.37开发出的最新个微API服务框架。 你可以 通过API 实现 个性化微信功能 (例云发单助手、社群小助手、客服系统、机器人等),用来自动管理微信消息。用户仅可一次对接…

得帆低代码OMS助力SAP和Oracle ERP订单模块全线升级,感受非凡体验

场景背景 随着数字化转型进入深水区,智能化、移动化、可视化的需求越来越强烈,而传统的Oracle、SAP销售模块很难快速满足销售端的上述需求,逐渐面临如下痛难点: IT服务商响应不足:企业越来越多信息化的业务需要大量的供…

30岁之前透支,30岁之后还债。

前言 看到不少私信问我为啥没有更新了,我没有一一回复,实在是身体抱恙,心情沉重,加上应付于工作,周旋于家庭,自然挤压了自我空间。 今天思来想去,重新执键,决定久违地又一次写点分…

Windows如何正确设置PHP环境变量以在Git Bash中运行命令

1、随便找一个目录,鼠标右键打开git bash here 2、cd的根目录 3、找到php安装目录 4、 在根目录下打开 vim .bash_profile ,添加环境变量,php地址根据自己的本地地址而定 PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.3.4nts 添加后保存…

【解刊】IEEE(trans),中科院2区,顶刊,CCF-A类,圈外人别想投?

计算机类 • 好刊解读 今天小编带来IEEE旗下计算机领域好刊的解读,如有相关领域作者有意向投稿,可作为重点关注!后文有真实发表案例,供您投稿参考~ 01 期刊简介 IEEE Transactions on Computers ☑️出版社:IEEE …