当前位置: 首页 > 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.gsyq.cn/news/148652.html

相关文章:

  • 永磁同步旋转电机发电并网控制仿真模型详解:涵盖PMSG、整流桥、逆变桥与电网,双闭环PI控制策略应用
  • 济南哪里能开病假条诊断证明
  • 配置vscode进行gdb调试
  • 西门子S7-200PLC玩转自动售货机(五种货物实战)
  • 无线电能传输技术:电动汽车充电的Matlab仿真与Maxwell DD线圈结构多线圈仿真研究
  • 微电网中的三相交流下垂控制:传统阻感型输出有功、无功及频率波形
  • 震惊了!5个国内主流大模型对同一本书的评价完全不同!
  • Day39bootstrap全局样式
  • Acticiti7工作流引擎 - yebinghuai-qq
  • 武汉哪里能开病假条诊断证明
  • 大模型微调优化:LoRA技术原理与实战详解
  • 【毕业设计】基于springboot的滑雪售票系统设计与实现(源码+文档+远程调试,全bao定制等)
  • Transformer 大语言模型(LLM)基石 - Transformer PyTorch2内置实现
  • 怎么实现Redis的高可用?
  • 学长亲荐10个AI论文工具,专科生搞定毕业论文格式规范!
  • 中望CAD机械版2025标注如何分行?教你一招搞定线下文字
  • 西方衰落是自身模式不可持续遇上中国制造业系统性崛起的必然结果
  • 杭州哪里能开病假条诊断证明
  • RAG系统上下文精度评估:从理论到实践的完整指南
  • 软工团队作业6--事后诸葛亮会议
  • 前端防范 XSS(跨站脚本攻击)
  • 2025最新!自考党必看!10个AI论文工具测评,哪款最能帮你写毕业论文?
  • 记2025鹏城杯CTF线上赛部分题目
  • 【 常用AI应用集成第三方api的教程】dify配置教程
  • 【开题答辩全过程】以 基于Springboot的体检中心信息管理系统设计与实现为例,包含答辩的问题和答案
  • 2025最新!自考党必备10个AI论文平台测评与推荐
  • FPGA与GPU通信:RDMA、PCIE实现方式
  • 当智能化工具应用于企业,如何借助AI销冠系统提升工作效率?
  • 2025年AI论文写作工具“防坑”红黑榜:谁在大搞学术诈骗,谁是真科研神器?
  • 【课程设计/毕业设计】基于springboot的滑雪售票系统设计与实现滑雪场日常售票、客流管控、订单管理【附源码、数据库、万字文档】