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

Java 类加载

类加载器遵循 双亲委派模型(JDK 9+ 弱化但仍保留核心逻辑):请求加载类时,先委托父加载器加载,父加载器无法加载时才自己加载(核心目的是避免类重复加载、保证核心类安全)。

类加载器分类

JDK 8 及更早版本

基于「三层类加载器 + 自定义加载器」的结构,核心分为 4 类,加载路径与 JVM 核心目录强关联。

  1. Bootstrap ClassLoader:不是 Java 语言实现,而是由 C/C++ 编写的 JVM 内核组件,属于 JVM 自身的一部分。无对应的 java.lang.ClassLoader 子类。用于加载 JVM 核心类库(保证 Java 基础运行环境)。
    加载目录 / 路径:
    核心路径:$JAVA_HOME/jre/lib 目录下的核心 jar 包(如 rt.jar、charsets.jar、sunrsasign.jar 等),且仅加载符合 JVM 识别的 jar(由 Xbootclasspath 参数限定)。
    验证方式:System.getProperty("sun.boot.class.path") 可查看其加载路径。
    无父加载器,加载的类属于「启动类加载器命名空间」,ClassLoader.getParent() 返回 null(因为不是 Java 对象)。
  2. Extension ClassLoader:扩展类加载器

类为 sun.misc.Launcher$ExtClassLoader,由Java 实现,继承 URLClassLoader,父加载器是启动类加载器(逻辑上,因为启动类加载器无 Java 对象,代码中通过 null 表示)。职责是加载 JVM 扩展功能的类库。
加载目录 / 路径:
核心路径:$JAVA_HOME/jre/lib/ext 目录下的所有 jar 包。
扩展路径:系统属性 java.ext.dirs 指定的目录(可通过 -Djava.ext.dirs 自定义)。
验证方式:System.getProperty("java.ext.dirs") 查看加载路径。
特点:JDK 8 中已逐步被模块化替代,JDK 9+ 完全移除。
3. 应用程序类加载器(Application ClassLoader)/ 系统类加载器(System ClassLoader)

具体的类名是 sun.misc.Launcher$AppClassLoader。由 Java 实现,继承自 URLClassLoader,父加载器是扩展类加载器。职责是加载应用程序自身的类(开发者编写的代码、第三方依赖)。
加载目录 / 路径:
核心路径:系统属性 java.class.path(即「类路径」,ClassPath),包括:
环境变量 CLASSPATH 指定的路径;
项目编译后的 target/classes(或 bin)目录;
第三方依赖 jar 包(如 lib/*.jar);
启动参数 -cp/-classpath 指定的路径(优先级最高)。
验证方式:System.getProperty("java.class.path") 查看加载路径。
特点:默认的类加载器(如 Class.forName() 未指定加载器时,默认使用此类加载器)。
4. 自定义类加载器(Custom ClassLoader)
本质:开发者继承 java.lang.ClassLoader 实现的自定义加载器(需重写 findClass() 方法,JDK 8 前若重写 loadClass() 会破坏双亲委派)。
核心职责:加载非标准路径的类(如网络、加密文件、自定义目录)。
加载目录:完全自定义(如 /opt/myclasses/、网络 URL、内存字节流等)。
典型场景:Tomcat 类加载器(隔离不同 Web 应用)、热部署、加密类加载。

Java 9及以后

JDK 9 引入 模块系统(JPMS),废弃 rt.jar、ext 目录,类加载器体系重构,核心保留 3 类(启动类加载器逻辑调整,扩展类加载器被移除)。

  1. 启动类加载器(Bootstrap ClassLoader)
    变化:
    不再加载 rt.jar,而是加载 JDK 核心模块(如 java.base、java.lang 等),模块路径为 $JAVA_HOME/jmods/。
    部分功能委托给「平台类加载器」,且首次支持通过 Java 代码访问(ClassLoader.getPlatformClassLoader())。
    加载路径:
    核心模块:$JAVA_HOME/jmods/ 下的系统模块(由 --module-path 或 --add-modules 指定)。
    系统属性:jdk.boot.class.path.append 可追加加载路径(替代原 sun.boot.class.path)。
    特点:仍为 C/C++ 实现,但命名空间与平台类加载器整合。
  2. 平台类加载器(Platform ClassLoader)
    别名:平台类加载器,替代原扩展类加载器。
    本质:Java 实现(jdk.internal.loader.PlatformClassLoader),父加载器是启动类加载器。
    核心职责:加载 JDK 平台模块(非核心但扩展的模块,如 java.sql、java.xml)和非模块的兼容类。
    加载路径:
    模块路径:$JAVA_HOME/lib/modules(JDK 内置平台模块)。
    系统属性:java.platform.class.path 可指定加载路径(替代原 java.ext.dirs)。
    启动参数:--platform-module-path 指定平台模块路径。
    特点:
    遵循双亲委派,但允许「向下委派」(平台类加载器可委托应用类加载器,打破严格双亲委派)。
    默认可见性:仅对系统模块和 java.ext.dirs 兼容路径可见。
  3. 应用程序类加载器(Application ClassLoader)
    别名:系统类加载器(System ClassLoader),类名改为 jdk.internal.loader.AppClassLoader。
    核心职责:加载应用模块(module-info.java 定义的应用模块)和类路径(ClassPath)下的非模块类。
    加载路径:
    模块路径:--module-path(-p)指定的应用模块路径(优先加载)。
    类路径:java.class.path(ClassPath)仍有效(兼容旧代码),但优先级低于模块路径。
    启动参数:--class-path(-cp)仍支持,用于加载非模块化的类。
    特点:
    父加载器是平台类加载器。
    模块化场景下,优先加载 module-path 中的模块类,再加载 class-path 中的类。
  4. 自定义类加载器(Custom ClassLoader)
    兼容:仍支持继承 ClassLoader 实现,但推荐遵循模块化规则(如通过 ModuleLayer 加载模块)。
    变化:
    重写 loadClass() 不再强制破坏双亲委派,JDK 9+ 允许「并行加载」和「模块层隔离」。
    支持加载模块化类(需通过 ModuleFinder 和 Configuration 构建模块层)。
    加载路径:仍自定义,但可整合模块路径(ModulePath)和类路径(ClassPath)。

总结

特性 JDK 8 JDK 9+
核心类库形式 rt.jar、ext/*.jar 模块化 jmods/
扩展类加载器 存在(ExtClassLoader) 移除(替换为平台类加载器)
类路径优先级 ClassPath 唯一 ModulePath > ClassPath
系统属性 java.ext.dirs java.platform.class.path
启动参数 -Djava.ext.dirs --platform-module-path
JDK 版本 核心类加载器 核心加载目录 / 形式 核心变化
JDK 8- 启动 + 扩展 + 应用 + 自定义 jre/lib/rt.jar、jre/lib/ext、ClassPath 经典双亲委派,基于 jar 加载
JDK 9+ 启动 + 平台 + 应用 + 自定义 jmods/、ModulePath、ClassPath 模块化加载,平台类加载器替代扩展类,弱化严格双亲委派
http://www.jsqmd.com/news/135350/

相关文章:

  • 11574_springboot学生宿舍信息的系统(11574)
  • 基于S7-200 PLC与组态王的机械手自动化搬运控制策略
  • 《智慧书》
  • 永磁同步旋转电机发电并网控制仿真模型详解:涵盖PMSG、整流桥、逆变桥与电网,双闭环PI控制策略应用
  • 回收盒马鲜生礼品卡前必看指南 - 京顺回收
  • 【课程设计/毕业设计】基于springboot+vue的医疗设备管理系统基于SpringBoot+Vue技术的医疗器械管理系统设计与实现【附源码、数据库、万字文档】
  • springboot安康旅游网站的设计与实现(11571)
  • ipv6设置,后面带个参数(指定设备接口名称):br0或ppp0
  • MATLAB R2021B环境下基于深度学习的车道线检测方法
  • 基于组态王技术的锅炉控制系统仿真研究与实现
  • 《蔡磊:纵使身体陨落,也要向死而生》
  • 未给entity的主属性赋值,Mybatisplus却抛出了type mismatch异常。——————分享一下Mybatisplus主键填充机制
  • 如何快速掌握Maye启动工具:新手必备的完整指南
  • 《生命的进程》
  • Java计算机毕设之基于SpringBoot+Vue技术的医疗器械管理系统设计与实现医疗机构对医疗器械高效、精准管理(完整前后端代码+说明文档+LW,调试定制等)
  • 基于springboot的厨艺交流平台的设计与实现(11572)
  • 本人,当福利送你们了.单部五层电梯报告 单部五层电梯,基于西门子1200 博图V15 1、外呼梯功能
  • 起名别随便用生僻字,家长以为“有文采”,可孩子在“吃瓜捞”
  • 2025重庆最新建筑加固改造、钢筋打断修复、土建、现浇、楼板开裂修复首选推荐现浇王子:重庆本土专业团队,铸就安心工程 - 全局中转站
  • 西门子S7-200PLC玩转自动售货机(五种货物实战)
  • 无线电能传输技术:电动汽车充电的Matlab仿真与Maxwell DD线圈结构多线圈仿真研究
  • 2025重庆最新建筑加固改造品牌TOP5 评测!优质服务商及企业权威榜单发布,技术赋能构筑建筑安全新生态 - 全局中转站
  • 微电网中的三相交流下垂控制:传统阻感型输出有功、无功及频率波形
  • 震惊了!5个国内主流大模型对同一本书的评价完全不同!
  • 重庆哪里能开病假条诊断证明
  • WebTopo拓扑图编辑器:从业务痛点出发的完整可视化解决方案
  • Alice-Tools终极指南:轻松处理AliceSoft游戏文件的完整教程
  • Day39bootstrap全局样式
  • PCILeech终极指南:掌握DMA攻击与内存取证完整方案
  • 吸烟如何“改写”你的DNA?新研究揭示表观遗传时钟与肺癌风险的秘密!