面试之双亲委派原理

一面腾讯提问:如果我自定义一个 new Object 类,请问这个类是否会被加载?

回答:不会,因为双亲委派,向上加载。回答的过程中磨磨唧唧。当然最后一面也是没有过。

 总之一句话:向上加载,向下委派.

 根据代码可见,就是loadclass递归调用,首先依次向上查找,向下委派。

详细解释:当一个类加载器收到加载任务时,会先交给自己的父加载器去完整,因此最终的加载的人任务都会交给最顶层的BootstrapClassLoader,只有当父加载器无法完成加载,才反馈进行递归回溯,此时子类加载的时候,就是通过调用对应的findClass(name)去加载,子类依次回溯加载。

接下来分别解释:这三层加载器的作用:

  • 启动类加载器(Bootstrap ClassLoader)
  • 扩展类加载器(Extension ClassLoader)
  • 应用类加载器(Application ClassLoader)

启动类加载器:内嵌在JVM内核的加载器,用C++语言编写(因此也不会继承ClassLoader),是类加载器中层次中最顶层的加载器。用于java的核心类库,即加载jre/lib/rt.jar包里面的数据。

扩展类加载器:它负责加载jre扩展目录的jar

应用类加载器:主要负责加载应用程序的主函数类。 ClassLoader.getSystemClassLoader()方法可以获取此类加载器的实例,系统类加载器也因此得名。应用类加载器主要加载classpath下的class。

上面已经解释了清楚了整个具体的流程:

接下来解释: 父类委派的优点是什么? 如何打破 父类委派。

如何打破 父类委派

首先自定义的类加载器 MyClassLoder extends ClassLoader。然后重写 loadclass方法。可以参考下面的demo来实现。

 上图就是ClassLoder类中给我们自定义NetworkClassLoader的demo。

 

我们整理ClassLoader里面具体的整体流程:

1:loadclass:双亲委派机制,子类加载器委托父类加载器加载,父类加载器都加载失败时,子类加载器通过findclass自行加载

2:findclass: 当前类加载器的根据路径以及class文件名称加载字节码,从clas文件中读取字节数组,然后hi用defineClass。

3:defineclass:根据字节数组,返回class对象。

父类双亲委派作用:

1:保证JVM的核心类和用户的类都能得到正常加载。或者说为了防止 findclass和defineclass对象覆盖标准库中的类对象,避免产生安全风险。

但发展会带来创新,创新就会带来变革,jdbc与tomcat打破了这个自古相传的机制。

在jdbc中,父加载器委托子加载器。即利用线程上下文类加载器,让启动类加载器得以委托应用类加载器,去加载jar中的数据库驱动。

 

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

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

相关文章

Morris遍历--验证二叉搜索树(java)

Morris遍历- 验证二叉搜索树题目描述Morris 遍历解题代码演示: morris 遍历改写后序遍历 验证二叉搜索树 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/validate-binary-search-tree 题目描述 给你一个二叉…

Mybatis中表关系查询结果集映射

文章目录 前言1. 实体类设计1.1 用户表1.2 地址表1.3 博客表1.4 粉丝互关表 2.插入数据3.表关联查询3.1 一对一关系3.2 一对多关系3.3 多对多关系 前言 resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来&#xff…

IMU+激光雷达实现大规模动作捕捉

VR技术的兴起,使得动作捕捉这门让人们可以使用肢体语言在虚拟世界中进行互动和交流的技术逐渐成为热门。随着科技的进步,如今的动作捕捉技术已经十分成熟,但在大规模场景中准确地捕捉人体运动仍然具有挑战性。它对于体育大型赛事、舞台表演、…

WPF Prims框架详解

文章目录 前言Prism基本使用Prism选择,DryIoc还是UnityPrism基本框架搭建Prism动态更新View和ViewModel对应关系参数动态更新函数动态绑定 prism新建项目模板region使用事例测试是否限制空间 消息订阅如何使用消息订阅使用建议 路由导航对话框/弹窗功能实现代码 前言…

C#开发的OpenRA游戏之维修按钮

C#开发的OpenRA游戏之维修按钮 前面分析物品的变卖按钮,如果理解这个流程,再看其它按钮的流程,其实是一样的,所以前面的文章是关键,只有理解通透的基础之上,才能继续往下。 维修按钮的存在价值,就是当建筑物受到敌方破坏,还没有完全倒掉之前,可以使用金币来进行修理。…

Redis学习(四)Redis原理:底层数据结构、网络模型、内存回收策略

文章目录 Redis底层数据结构SDS 动态字符串IntSet 整数集合Dict 字典Dict伸缩中的渐进式再哈希 ZipList 压缩列表QuickLisk 快速列表SkipList 跳表动态索引建立 RedisObject变量类型与数据结构实现StringListSetZSetHash Redis网络模型Redis是单线程还是多线程?为什…

用vscode远程连接Linux服务器后,如何创建自己的账号

1. 打开终端(Terminal)窗口 2. 在终端中创建新的用户账号 (假设您要创建的用户名为 “newuser”),在命令执行期间,需要提供新用户的密码。按照提示进行操作。 先输入登录的管理员账号密码。 再输入创建的…

CMS系统访问权限限制

创建一些全局的通用方法 const USER_KEY "USER_KEY" const TOKEN_KEY "JWT_TOKEN_KEY"class Auth {constructor() {this.token nullthis.user nullthis.token localStorage.getItem(TOKEN_KEY)const userJson localStorage.getItem(USER_KEY)if (use…

大华监控前端实时预览(踩坑)

难点在后端,前端主要是文档太少了,前端难点主要是接入摄像头,摄像头接入了,剩下什么对讲、调整方向、变焦之类的就简单了。 大华官网:https://open-icc.dahuatech.com/#/home 1.到官网下载插件或者demo,我是…

SpringBoot + WebSocket+STOMP指定推送消息

目录 一、前提条件1.2 环境要求1.3 依赖 二、相关工具类准备2.1 发送消息载体2.2 接收消息载体2.3 消息处理接口2.4 为 STOMP 消息传递配置 Spring 三、前端部分四、效果 一、前提条件 本文将简单的描述SpringBoot WebSocketSTOMP指定推送消息场景,不包含信息安全加…

实时监测与报警,探索CMS系统在半导体设备安全管理中的作用

在半导体制造行业,设备的安全管理对于保障生产运行和员工安全至关重要。中央设备状态监控系统CMS(central monitoring system)是一种关键的解决方案,为企业提供实时监测和报警功能,有效应对设备安全管理的挑战。本文将…

网页动态表单 ,网页动态参数

有的时候因为参数太多 无法 一一 创建 所有采用动态创建 自己遇到的一个实际情况今天写个例子 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>form demo</title><link rel"stylesheet" href&quo…