网站首页 > java教程 正文
今天来分享一道关于java类加载方面的面试题:什么是双亲委派?
双亲委派的英文是parent delegation model,从真正的实现逻辑来看,正确的翻译应该是父委托模型。不管它叫什么,我们来先看看遇到这个问题的时候,应该怎么去回答呢?
首先,简单说一下类的加载这样一个机制,就说我们自己写的java文件到最终运行,它必须要经过编译和类加载这两个阶段。编译的过程就是把点java文件编译成点class文件,类的加载过程,就是把点class文件加载到jvm的内存里面,装载完成以后会得到一个class对象,我们就可以使用new关键字来实例化这个对象。
而类的加载过程需要涉及到类加载器,JVM在运行的时候会产生3个类加载器,这3个类加载器组成了一个层级关系,每一个类加载器分别去加载不同作用范围的jar包。Bootrap ClassLoader主要是负责java核心类库的加载,也就是JDK_HOME/lib下面的一个rt.jar和resource.jar等等。Extension ClassLoader主要是负责JDK_HOME/lib/ext目录下的一个jar包和class文件,ApplicationClassLoader主要是负责当前应用里面classpath下面的所有jar包和类文件。除了系统自己提供的类加载器以外,还可以通过ClassLoad类来实现自定义加载器,去满足一些特殊的场景需求。
而所谓的父委托模型呢,就是按照类加载器的层级关系逐层进行委派。比如说当我们需要加载一个class文件的时候,首先会去把这个class文件的查询和加载,委派给父加载器去执行,如果父加载器都无法加载,那么再尝试自己来加的这个class。
这个设计的好处包含下述两点。
第一个是安全性,因为这种层级关系实际上代表的是一种优先级,也就是说所有的类加载优先要给到Boostrap ClassLoader,对于核心类库中的一些类,就没有办法被破坏。比如说自己写一个String,最终还是会交给启动类加载器,再加上每个类加载器的本身的作用范围,那么自己写的String,就没有办法去覆盖类库中的类。
第二个是可以避免重复加载导致程序混乱的一些问题,因为如果父加载器已经加载过了,那么子加载器就没有必要再去加载了。
猜你喜欢
- 2025-02-04 SpringBoot开发 - 什么是热部署和热加载?devtool的原理是什么?
- 2025-02-04 JVM详解之:类的加载链接和初始化(类加载java)
- 2025-02-04 jvm超详细探索自定义类加载器(值得收藏)
- 2025-02-04 详解java反射的原理(java 的反射)
- 2025-02-04 JVM性能调优(1)——JVM内存模型和类加载运行机制
- 2025-02-04 Java反射:作用与原理解析(java反射到底有什么用)
- 2025-02-04 java类加载与初始化(java类的加载机制及加载过程)
- 2025-02-04 类加载的验证阶段你不知道的东西(类加载检查)
- 2025-02-04 类是如何加载的?(类的加载过程是什么?简单描述一下每个步骤)
- 2025-02-04 Java类加载器及双亲委派机制:深入理解与示例
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)