【Java面试】5年去某团面试竟遇到这么简单的题?如何破坏双亲委派模型?看看高手是如何回答的

news/2024/5/19 11:25:29/文章来源:https://blog.csdn.net/q331464542/article/details/127106662

“如何破坏双亲委派模型”!

这是一个工作5年的同学去美团面试遇到的面试题。

大家好,我是Mic,咕泡科技联合创始人

下面来分析一下这个问题的考察目的

考察目的

这是一个偏Java基础的问题,考察3年以上的Java程序员。

这个问题考察目的有两个:

  1. 了解求职者对于Java基础的掌握深度,类加载相关知识点挺多的,涉及到类加载器、类的生命周期、JVM的工作原理,掌握这些基础可以快速解决程序中的一些问题,比如加载的类版本错误导致NoSuchMethodException

  2. 平时的工作中几乎不会用到类加载器,也不需要涉及到这方面的专业知识,所以这个问题很好的实现了人才能力的筛选

下面来分析一下这个问题的具体背景。

问题分析

我们自己写的java源文件到最终运行,必须要经过编译和类加载两个阶段。

编译的过程就是把.java文件编译成.class文件。

类加载的过程,就是把class文件装载到JVM内存中,装载完成以后就会得到一个Class对象,我们就可以使用new关键字来实例化这个对象。

而类的加载过程,需要涉及到类加载器。

JVM在运行的时候,会产生3个类加载器,这三个类加载器组成了一个层级关系。

每个类加载器分别去加载不同作用范围的jar包,比如

  • Bootstrap ClassLoader,主要是负责Java核心类库的加载,也就是 %{JDK_HOME}\lib下的rt.jar、resources.jar等

  • Extension ClassLoader,主要负责%{JDK_HOME}\lib\ext目录下的jar包和class文件

  • Application ClassLoader,主要负责当前应用里面的classpath下的所有jar包和类文件

除了系统自己提供的类加载器以外,还可以通过ClassLoader类实现自定义加载器,去满足一些特殊场景的需求。

而双亲模型,就是按照类加载器的层级关系,逐层进行委派。

比如当需要加载一个class文件的时候,首先会把这个class的查询和加载委派给父加载器去执行,如果父加载器都无法加载,再尝试自己来加载这个class。

不过,双亲委派并不是一个强制性的约束模型,我们可以通过一些方式去打破双亲委派模型。

这个打破的意思,就是类加载器可以加载不属于当前作用范围的类,实际上,JVM本身就存在双亲委派被破坏的情况。

第一种情况,双亲委派是在JDK1.2版本发布的,而类加载器和抽象类ClassLoader在JDK1.0就已经存在了,用户可以通过重写ClassLoader里面的loadClass()方法实现自定义类加载,JDK1.2为了向前兼容,所以在设计的时候需要兼容loadClass()重写的实现,导致双亲委派被破坏的情况。

同时,为了避免后续再出现这样的问题,不在提倡重写loadClass()方法,而是使用JDK1.2中ClassLoader中提供了findClass方法来实现符合双亲委派规则的类加载逻辑。

第二种情况,在这个类加载模型中,有可能存在顶层类加载器加载的类,需要调用用户类加载器实现的代码的情况。

比如java.jdbc.Driver接口,它只是一个数据库驱动接口,这个接口是由启动类加载器加载的。

但是java.jdbc.Driver接口的实现是由各大数据库厂商来完成的,既然是自己实现的代码,就应该由应用类加载器来加载。

于是就出现了启动类加载器加载的类要调用应用类加载器加载的实现。

为了解决这个问题,在JVM中引入了线程上下文类加载器,它可以把原本需要启动类加载器加载的类,由应用类加载器进行加载。

除此之外,像Tomcat容器,也存在破坏双亲委派的情况,来实现不同应用之间的资源隔离。

了解了这些背景之后,我们来看看高手该怎么回答。

高手:

我知道有两种方式来破坏双亲委派模型

  1. 第一种,集成ClassLoader抽象类,重写loadClass方法,在这个方法可以自定义要加载的类使用的类加载器。

  2. 第二种,使用线程上下文加载器,可以通过java.lang.Thread类的setContextClassLoader()方法来设置当前类使用的类加载器类型。

总结

好的,大家知道怎么回答这个问题了吗?

今天的视频就到这里结束了,喜欢这个作品的小伙伴记得点赞收藏加关注!!!

 另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前已经更新200期,总计超过20W字!

【想领取面试文档的小伙伴可以点击文章底部名片无套路免费赠送给大家!】

需要高手面试文档面试文档的小伙伴可以扫描下方二维码
↓↓↓↓↓↓↓↓↓↓↓↓↓

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

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

相关文章

了解IO,内外存,文件操作这一篇就够了

目录 一、什么是IO 二、内外存 内存特点: 外存特点: 三、文件系统 一、什么是IO IO是input和output两个词的首写,也就是输入和输出,他描述的是计算机数据流动的过程。 一台计算机必须有CPU,内存,主板&#xff0…

手把手带你免费申请《软件著作权》 超详细计算机软件著作权申请教程 文末送模板

文章目录什么是软著?软著的作用?软著的申请方式及流程?🚀1. 选择办理身份2. 填写软件申请信息3. 填写软件开发信息4. 填写软件功能与特点5. 确认信息6. 打印申请表软著材料准备?🌟1. 程序鉴别材料2. 文档鉴…

C语言的enum(枚举)

一、enum的语法格式为:enum 枚举名 {枚举元素1,枚举元素2,……}; 二、用enum代替define繁琐的定义 1、繁琐的define定义:#define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6 #define SUN 7 2、用enum就可以显得简洁 enum是一种…

CVPR 2022 Oral 大连理工提出的SCI 快速、超强的低光照图像增强方法 亲测效果

模型43M,1060显卡 640*400 图像耗时1-2毫秒,速度挺快的。 开源地址: GitHub - vis-opt-group/SCI: [CVPR 2022] This is the official code for the paper "Toward Fast, Flexible, and Robust Low-Light Image Enhancement". demo效果: 自己编写了读取图片测试…

基于安卓Android银行排队叫号系统设计与实现

目录 第1章 绪论 1 1.1课题来源与选题背景 1 1.2 课题研究现状 1 1.3 项目意义和价值 2 1.3.1意义 2 1.3.2价值 2 1.4 研究方法 2 1.5 论文内容及组织结构 3 1.5.1内容 3 1.5.2组织结构 3 1.6本章小结 3 第2章 系统主要理论与技术基础 4 2.1 Android平台简介 4 2.1.1 Android 发…

【Redis】为什么这么快?

文章目录Redis为什么是单线程的?Redis为什么基于内存?为什么要为Redis绑定某一固定CPU?Redis的多线程情况Redis的单线程到底有多快?总结Redis为什么是单线程的? 关于这个问题,官方给出的解释如下&#xff…

对于一位合格的DBA,究竟需要掌握多少种数据库?

随着数字经济蓬勃发展,大数据产业不断升级。数据库的重要性与芯片、操作系统并行,成为我国现代信息技术领域的三大核心基础。近期,我们也看到,中国人社部公示的18个新职业中,“数据库运行管理员”成为新职业&#xff0…

通过mockjs生成随机响应数据

今天给大家带来通过mock为每个组件准备模拟数据,生成随机响应数据,如果哪里不对,请多多指教。 1. mockjs介绍(为每个组件准备模拟数据) Mock.js是一个模拟数据的生成器,用来帮助前端调试开发、进行前后端的…

对话Relation:SBT与社交图谱给Web3社交带来新机遇

这是白话区块链的第1765期原创 作者 | 白话区块链出品|白话区块链(ID:hellobtc)9月29日下午,白话区块链邀请Relation CMO Santry 和产品负责人Joe做了一场AMA,畅聊SBT与社交图谱将给Web3社交带来的新机遇。…

H2 数据库的 expected identifier 错误

尝试使用 H2 数据库创建表,但是老是提示 expected "identifier 这个错误。问题和解决 经过搜索后才知道,上面的错误是因为我们使用的表名 USER 是 H2 的关键字。 H2 的关键字列表为:Advanced 很明显这里 是一个关键字。可以:简单粗暴的对使用的关键字使用单引号 在JDB…

【冰糖Python】深度森林 DeepForest

此文为记录DeepForest的简单使用 原文《Deep Forest: Towards an Alternative to Deep Neural Networks》 “A key advantage of deep forest is its adaptive model complexity depending on the dataset. The default setting on hyper-parameters enables it to perform r…

springboot+vue前后端分离项目搭建

今天开始学习springboot+vue的前后端分离项目,跟着bili的视频开始做起。 第一步 安装node.js node.js自带npm插件,npm 是node的一个包管理工具,安装好了node.js,就安装了npm。安装好后可以在cmd(或者shift+鼠标右键打开powershell窗口)中执行 node -v 和 npm -v 命令查看…

粒子系统实现与原理

粒子系统简介: 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象、物理现象及空间扭曲上具备得天独厚的优势,能为我们实现一些真实自然而又带有随机性的效果(如爆炸、烟花、水流)提供了方便。Cocos2d-…

django小区居民出入申报系统Vue+flask疫情防控社区疫苗预约系统python

本系统主要包括管理员和用户;主要包括首页,个人中心,新闻动态管理,用户管理,地区信息管理,小区单元管理,疫苗种类管理,疫苗信息管理,疫苗研发管理,地区疫苗管…

项目管理中最常见的问题有哪些?

问:在执行项目过程中,什么最重要? 答:当我们开车时,我们的 GPS 能准确定位,也能立即重新规划路线。 当我们的家人到不同城市旅游时,自动柜员机(ATM)能实时处理不同家人的…

Android Platform Architecture 安卓平台架构

Android Platform Architecture 安卓平台架构 Android is an open source, Linux-based software stack created for a wide array of devices and form factors. The following diagram shows the major components of the Android platform. Android 是一种基于 Linux 的开放…

如何解决IDEA中Tomcat右上角出现红叉问题

问题如下图所示: 错误原因:没有将当前项目在Tomcat上进行部署 下面是问题的详细解决步骤: 1.Run-->Edit Configurations 2.点击页面右下角的Fix 3.点击Deployment页面中的号 然后选择Artifact 4.选择你要部署的当前项目 5.点击Apply应用…

第一季:5递归与迭代【Java面试题】

第一季:5递归与迭代【Java面试题】前言推荐第一季:5递归与迭代题目递归循环迭代小结最后前言 2022 9/30 12:36 路漫漫其修远兮,吾将上下而求索 本文是根据尚硅谷学习所做笔记 仅供学习交流使用,转载注明出处 推荐 【尚硅谷经典Java面试题第…

Java流程控制10(打印三角形)

Java流程控制10(打印三角形) 打印三角形(5行)* **** ** ****** *** ********* ***…

小岳岳要翻拍电影,粉丝建议他拍一部《羊了个羊》

说起大明星岳云鹏,很多人都知道他是一个相声演员,其中这种说法已经有些狭隘,因为他已经不再局限于相声,而是多领域全方位发展。岳云鹏在说相声的间隙,还参加过很多的综艺节目,都给观众留下了非常深刻的印象…