当前位置: 首页 > news >正文

JVM 类加载原理之双亲委派机制(JDK8版本)

对 Java 程序的运行过程而言,类的加载依赖类加载器完成,而在 Java 默认的类加载器又分为启动类加载器、扩展类加载器和应用程序类加载器三种,但是一个类通常仅仅需要被加载一次即可,双亲委派机制即规定各个类该被何种类加载器加载的一种机制。

双亲委派机制的实现原理可以简述为两个方面,分别是 “向上委托请求”“向下委派加载”

  • “向上委托请求”:当一个类加载器收到加载类的请求时,并不会直接对该类进行加载,而是会先将加载请求委托给其当前父类加载器,而当前父类加载器也会依次委托给其更上层的父类加载器,直至达到顶层的启动类加载器。
  • ”向下委派加载“:顶层的启动类加载器收到下层类加载器的加载类的请求后。会先判断自身(即启动类加载器)是否已经加载过该类,如果未加载过,则向下层的子类加载器寻求将该类进行加载。子类加载器则判断自身(当前的类加载器)有无加载该类的能力,如果有能力加载该类,则对该类进行加载;如果无能力加载该类,则继续向下层的类加载器传递该类的加载请求。

以下是对双亲委派机制的实现原理图示解读:

在这里插入图片描述
双亲委派机制的设计是为保证 Java 核心库(如 java.langjava.util 等)始终由启动类加载器来加载,以保持这些核心类的唯一性、一致性、安全性,避免不同的类加载器加载相同名称的类而导致类的冲突和混乱。其主要体现于如下方面:

  1. 避免类的重复加载:如果一个类已经被某个类加载器加载了,那么另外一个类加载器是无法再次加载这个类的,从而避免了类的重复加载。

  2. 避免恶意类的加载:通过限制不受信任的类加载器加载系统类库以提高系统的安全性,避免恶意类的加载和破坏。

    例如,定义一个 JDK 中重复的包路径 java.lang,并在该包路径下定义一个类:

    package java.lang;
    
    public class CustomInteger {
    
    }
    

    然后,定义一个类尝试去加载这个该类:

    package org.example.jvm;
    
    public class LoadSimpleClassTest {
    
        public static void main(String[] args) throws ClassNotFoundException {
            ClassLoader classLoader = LoadSimpleClassTest.class.getClassLoader();
            Class<?> customIntegerClass = classLoader.loadClass("java.lang.CustomInteger");
            System.out.println(customIntegerClass);
        }
    
    }
    

    执行上述案例将抛出如下异常:

    在这里插入图片描述
    因为 java.lang 是 JAVA 中的核心包,所以禁止直接以代码形式在项目中定义加载该包下的类。

相关文章:

  • spring boot3.4.3+MybatisPlus3.5.5+swagger-ui2.7.0
  • Qt 加载插件:实现可扩展应用的秘诀
  • halcon机器人视觉(二)固定相机抓取hand_eye_stationarycam_grasp_nut
  • 【Mastering Vim 2_12】(完结篇)第九章:以终为始 —— Vim 推荐编辑习惯与相关学习资源整理
  • mapbox高阶,结合threejs(threebox)添加管道
  • vscode(cursor)配置python环境,含远程调试
  • MATLAB并行计算加速,用 parfor 和 spmd 榨干多核CPU性能
  • Jeinkins配置sonarqube
  • 网络安全之数据加密(DES、AES、RSA、MD5)
  • PPO算法 - AI学习记录
  • bug-Ant中a-select的placeholder不生效(绑定默认值为undefined)
  • 代理IP与反爬技术的博弈
  • 代码优化——基于element-plus封装组件:表单封装
  • 02C#基本结构篇(D4_注释-访问修饰符-标识符-关键字-运算符-流程控制语句)
  • OpenEuler24.x下ZABBIX6/7实战1:zabbix7.2.4安装及zabbix-agent安装
  • 软考 数据通信基础——信道
  • SpringBoot 如何调用 WebService 接口
  • 微服务Sentinel组件:服务保护详解
  • 【Java---数据结构】二叉树(Tree)
  • TypeScript变量声明详解:与JavaScript的对比与工程化价值
  • 北方首场高温将进入鼎盛阶段,江南华南多地需警惕降雨叠加致灾
  • 出走的苏敏阿姨一路走到了戛纳,这块红毯因她而多元
  • 消息人士称俄方反对美国代表参加俄乌直接会谈
  • 金融月评|尽早增强政策力度、调整施策点
  • 韩正会见美国景顺集团董事会主席瓦格纳
  • 通往国际舞台之路:清政府与万国公会的交往