首页 > 编程语言 >一文搞懂Java中的双亲委派

一文搞懂Java中的双亲委派

时间:2024-07-21 15:25:25浏览次数:18  
标签:委派 类库 Java ClassLoader 双亲 搞懂 加载

一天正在宿舍里忙着写代码。突然,老师给我布置了一项新任务:优化他正在开发的项目中的类加载机制。我对类加载器了解不多,开始翻阅各种资料,逐渐了解了Java中的类加载器机制。尤其是当读到双亲委派模型时,脑海中豁然开朗。仿佛看到了类加载请求在层层递进、逐步传递的画面,像极了树状结构中的节点。于是,决定写一篇博客,把自己的理解分享给更多的开发者。

什么是双亲委派模型

在Java中,类加载器(ClassLoader)是一个非常重要的组件,用于在运行时动态加载类文件。而双亲委派模型则是类加载器的一种重要机制,它规定了类加载请求的传递顺序,从而确保了Java类加载过程的安全性和稳定性。

双亲委派模型的原理

当一个类加载器收到类加载请求时,它不会自己直接去加载这个类,而是首先将请求委派给它的父类加载器。如果父类加载器无法完成这个加载请求,子类加载器才会尝试自己去加载。

类加载器的层次结构

有一张图比较形象:

 

在Java中,类加载器大致分为三种:

  1. 启动类加载器(Bootstrap ClassLoader)

    • 负责加载Java核心类库,如rt.jar
    • 由JVM内部实现,没有父加载器。
  2. 扩展类加载器(Extension ClassLoader)

    • 负责加载扩展类库,如lib/ext目录下的类。
    • 启动类加载器的子类加载器。
  3. 应用程序类加载器(Application ClassLoader)

    • 负责加载用户类路径(classpath)上指定的类。
    • 扩展类加载器的子类加载器。

 双亲委派的优点

这种层层委派的机制保证了Java核心类库的安全性。例如,java.lang.Object类总是由顶层的启动类加载器(Bootstrap ClassLoader)加载,从而避免了用户自定义的类库篡改核心类库的风险。

小实践

在编译层面

  • java.lang 包的类被编译成字节码文件,并被打包在 rt.jar(运行时库)中。rt.jar 文件位于 JDK 的 lib 目录下。
  • 绝对路径:C:\Program Files\Java\jdk1.8.0_261\jre\lib\rt.jar!\java\lang\ClassLoader.class

标签:委派,类库,Java,ClassLoader,双亲,搞懂,加载
From: https://blog.csdn.net/m0_62056231/article/details/140560174

相关文章

  • 一文搞懂银行家算法
    在学操作系统的时候,了解到死锁问题,今天在学习并发编程时,也遇到了死锁,在了解了死锁的原因后,遇到一个经典的算法——银行家算法,这是一种避免死锁的算法。在学习完后,我决定总结一下银行家算法的核心思想。什么是死锁?死锁是指在计算机系统中,多个进程或线程因竞争资源或互相等待而......
  • Java语言概述
    1.常用的DOS命令进入DOS操作窗口:按下Windows+R键盘,打开运行窗口,输入cmd回车,进入到DOS的操作窗口。常用指令:操作说明盘符名称:盘符切换,如:E:表示切换到E盘dir列出当前目录下的文件及文件夹cd目录进入指定的单级目录cd目录1\目录2\...进入指......
  • JavaEE初阶(1)—— 计算机理论常识
    目录一.JavaEE发展历程二.计算机相关知识2.1计算机发展史2.2 冯诺依曼结构(VonNeumannArchitecture)2.3CPU1.cpu做得好的公司2.cpu架构3.cpu的核心参数4.cpu的寄存器(Register)2.4指令 1.概念 2.指令表3.指令格式4.指令执行阶段 2.5操作系统概述一.J......
  • Java基础之异常
    异常1.概述​代码出现了不正常的现象,在Java中每一个异常都是java一个一个的类,或者叫做异常对象2.异常体系说明Throwable:Error:错误类似于人得了癌症,不能通过处理让代码变正常,必须得重新写Exception:异常(所有异常的父类)类似于人得了感冒可以治疗,可以通过......
  • Java 基础学习第一节:初始 Java 及其安装
    第一节001.大项目贯穿学习能力动手能力耐心和毅力表达能力002.学习中碰到问题怎么办找同桌找同学找项目经理找讲师003.学习Java的窍门多想公司需要什么?熟练掌握这个东西的人.如何才能熟练呢?多练练学Java就像学车,天天看别人开车,自己无论怎么看都不会,必须亲自......
  • ChatGPT:Java的双冒号运算符(::)
    ChatGPT:Java的双冒号运算符(::)为什么说双冒号运算符(::)通过引用现有的方法或构造器,简化了Lambda表达式的定义在Java中,双冒号运算符(::)是用于方法引用的符号。方法引用是一种更简洁、更直观的方式来表示Lambda表达式。它通过引用现有的方法或构造器,简化了Lambda表达式的定义......
  • 计算机课设——基于Java web的超市管理系统
    smbms_java_web基于Javaweb的超市管理系统,数据库课程设计1.引言是一个基于JavaWeb连接MySQL的小项目。超市管理系统(smbms)作为每个计算机专业的大学生都是一个很好的练手项目,逻辑层次分明,基础功能包括用户的登录和注销,用户和供应商以及订单信息的增删查改的基础功能......
  • 【前端】JavaScript入门及实战21-25
    文章目录21关系运算符22编码23相等运算符24条件运算符25运算符优先级21关系运算符<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><scripttype="text/javascript"> /* 通过关系运算符可以比较两个值之间的大小关系, 如果关......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日派对座位安排(200分) - 三
    ......
  • java多线程等待唤醒机制详细介绍
    java多线程等待唤醒机制一.方法介绍方法说明voidwait()线程等待,等待的过程中线程会释放锁,需要被其他线程调用notify方法将其唤醒,重新抢锁执行voidnotify()线程唤醒,一次唤醒一个等待线程;如果有多条线程等待,则随机唤醒一条等待线程voidnotifyAll()唤醒所有等待线......