了解类加载器吗?类加载器的类型有哪些?

一、什么是类加载器(ClassLoader)

类加载器是 Java 虚拟机中的一部分,负责将 .class 文件加载到 JVM 内存中,生成对应的 Class 对象。

Java 程序中所有的类在使用前都必须通过类加载器加载进 JVM,才能被执行。


二、类加载器的作用

  • 加载 .class 文件到内存中。
  • 将字节码转换为 JVM 能识别的 Class 对象。
  • 实现类的 命名空间隔离
  • 支持 模块化开发(如插件机制、自定义业务模块加载)。

三、类加载器的分类(JVM 内置 + 用户自定义)

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

  • 作用: 加载 JVM 的核心类库,如 java.lang.*java.util.* 等。
  • 加载路径: JAVA_HOME/lib 目录中的类(如 rt.jar)。
  • 实现: 由 C/C++ 实现,是 JVM 的一部分。
  • 特点: 不是 Java 类,不能被直接引用或操作。

2. 扩展类加载器(Extension ClassLoader)

  • 作用: 加载 Java 扩展类库。
  • 加载路径: JAVA_HOME/lib/ext/ 目录或由 java.ext.dirs 系统变量指定的路径。
  • 父加载器: Bootstrap ClassLoader。
  • 类名: sun.misc.Launcher$ExtClassLoader

3. 应用类加载器 / 系统类加载器(Application ClassLoader)

  • 作用: 加载用户类路径(classpath)下的类文件。
  • 加载路径: 当前应用的 classpath(如 jar 包或类文件所在目录)。
  • 父加载器: Extension ClassLoader。
  • 类名: sun.misc.Launcher$AppClassLoader

4. 自定义类加载器(Custom ClassLoader)

  • 作用: 开发者可以继承 java.lang.ClassLoader 实现自己的加载逻辑。

  • 使用场景:

    • 热部署
    • 模块化(如 OSGi)
    • 插件系统
    • 加密 class 文件
  • 常见方式:

    • 继承 ClassLoader 并重写 findClass() 方法
    • 调用 defineClass() 定义类对象

四、类加载器的层次结构图

┌──────────────────────────┐
│ Bootstrap ClassLoader    │
│ (C++实现, 加载核心类库)     │
└──────────┬───────────────┘↓
┌──────────────────────────┐
│ Extension ClassLoader    │
│ (加载 ext 目录类)          │
└──────────┬───────────────┘↓
┌──────────────────────────┐
│ Application ClassLoader  │
│ (加载classpath下类)        │
└──────────┬───────────────┘↓
┌──────────────────────────┐
│ 自定义 ClassLoader       │
│ (可指定加载路径/策略)     │
└──────────────────────────┘

五、双亲委派机制(Parent Delegation Model)

定义:

类加载器在加载类时,首先会 将加载请求委托给父加载器,由顶层的 Bootstrap 开始查找,只有在父加载器找不到时,才由当前加载器加载。

加载流程:

  1. 当前类加载器收到类加载请求。
  2. 委托给父类加载器。
  3. 如果父类无法加载,才由当前加载器尝试加载。

优点:

  • 避免类的重复加载。
  • 防止用户自定义类覆盖 JDK 核心类(如 java.lang.String)。

举例说明:

public class Test {public static void main(String[] args) {System.out.println(String.class.getClassLoader()); // null(Bootstrap)System.out.println(Test.class.getClassLoader());   // AppClassLoader}
}

六、自定义类加载器示例

public class MyClassLoader extends ClassLoader {@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] data = loadClassData(name); // 从文件或网络中读取字节数组return defineClass(name, data, 0, data.length);}
}

七、线程上下文类加载器(ContextClassLoader)

定义:

  • 每个线程可以设置自己的类加载器,用于动态加载类或资源。
  • 默认是 Application ClassLoader

用途:

  • 在 Java SPI(Service Provider Interface)中尤为重要。
  • 解决双亲委派带来的灵活性限制。
Thread.currentThread().setContextClassLoader(new MyClassLoader());

八、类加载器相关方法(Java API)

方法说明
loadClass(String name)加载类(会委托给父类)
findClass(String name)查找类(自定义类加载核心)
defineClass(...)将字节数组转为 Class 对象
getParent()获取父加载器
getClassLoader()获取当前类的加载器

九、面试常问点总结

问题要点回答
什么是类加载器?.class 加载进内存,生成 Class 对象。
JVM 有哪些类加载器?启动类、扩展类、应用类、自定义类加载器。
双亲委派模型是什么?加载委托给父加载器,避免重复 & 保证安全性。
如何打破双亲委派?重写 loadClass() 不委托父类。
自定义类加载器的用途?插件、加密、安全、热更新、动态部署等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92119.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP面向对象高级特性:魔术方法、对象迭代器与设计模式应用

引言 在前一篇文章中,我们探讨了PHP的Traits、匿名类和对象比较机制。本文将深入PHP面向对象编程的更多高级特性,包括魔术方法、对象迭代器以及常用设计模式的实际应用,这些特性能够帮助开发者构建更加灵活和强大的面向对象系统。 魔术方法深度解析 魔术方法是PHP中一组以…

【Java基础】一个月教你轻松掌握Java——第三篇Git

一、Java概述&#xff08;之前的文章&#xff09;二、版本控制工具Git其实这个与Java基础关系不大&#xff0c;但是这个工具还是很重要的&#xff0c;不管是团队之间打比赛还是就业都应该学会它&#xff0c;秉持着学的早一些&#xff0c;用的时间长一点&#xff0c;会更熟练。&…

【C# in .NET】16. 探秘类成员-索引器:通过索引访问对象

探秘类成员-索引器:通过索引访问对象 在 C# 中,索引器(Indexer)是一种独特的类成员,它允许类或结构的实例像数组一样被索引访问,为数据访问提供了极大的灵活性。本文将从基础概念出发,深入.NET 框架底层,剖析索引器的实现机制,并通过实战案例展示其强大的应用价值。 …

idea出现:java: Target level ‘1.7‘ is incompatible with source level ‘1.8‘.解决办法

在文件->设置->java编译器&#xff0c;把这里版本对应上。这里用的是8版本

ssms(SQL 查询编辑器) 添加快捷键 Ctrl+D(功能等于Ctrl+C + Ctrl+V),一步到位

1,打开ssms 工具&#xff0c;打开对应添加快捷键得地方2&#xff0c;分配 快捷键3&#xff0c;看效果

数学建模--层次分析法

层次分析法&#xff08;AHP&#xff09;笔记 一、核心概念 &#xff08;一&#xff09;问题本质 面对多方案、多准则决策&#xff0c;将复杂问题分层拆解&#xff0c;通过定性与定量结合&#xff0c;确定各因素权重&#xff0c;选出最优方案&#xff0c;比如选“微博之星”时综…

人工智能教研室暑期培训flask全栈开发培训

人工智能教研室暑期培训flask全栈开发培训第一天&#xff1a;Flask 基础入门与环境搭建实践项目&#xff1a;搭建个人博客首页&#xff0c;包含文章列表与详情页上午&#xff1a;环境搭建与 Flask 基础1. 安装 Python 与虚拟环境配置2. Flask 框架简介与第一个 "Hello Wor…

MySQL(141)如何处理重复数据问题?

处理重复数据问题是数据管理中的一个常见挑战。重复数据会影响数据库的性能、占用资源&#xff0c;并且可能导致数据分析结果的偏差。以下是处理重复数据问题的详细步骤以及结合代码的示例。 一、识别重复数据 首先&#xff0c;需要识别数据库中的重复数据。可以使用 SQL 查询来…

MySQL 核心知识点梳理(3)

目录 SQL优化 23什么是慢SQL 如何优化呢? 如何利于覆盖索引 如何使用联合索引 如何进行分页优化 Join代替子查询 为什么要小表驱动大表? 为什么避免join太多的表? 如何进行排序优化 什么是filesort 全字段排序和rowid排序 条件下推 索引 索引为什么能提高MyS…

关于注册登录功能制作的步骤(文件IO存储+LVGL弹窗提示)

按你的需求&#xff08;文件IO存储LVGL弹窗提示&#xff09;&#xff0c;工程需创建以下文件&#xff0c;代码按功能模块化存放&#xff0c;清晰明了&#xff1a;一、需要创建的文件清单 文件名 作用 存放内容 main.c 程序入口 主函数、硬件初始化、LVGL初始化、启动界面 ui.…

自媒体端后台设计指南:从注册认证到内容管理的全流程搭建

自媒体端后台设计指南&#xff1a;从注册认证到内容管理的全流程搭建自媒体端后台是专业创作者管理内容、粉丝和数据的核心阵地&#xff0c;其设计直接影响创作效率和平台运营质量。一个功能清晰、操作便捷的后台系统&#xff0c;能让创作者专注于内容生产&#xff0c;而非被复…

uniapp扫描二维码反色处理

在开发扫描二维码过程中&#xff0c;发现白底黑码可以直接用uni.scanCode扫描出来&#xff0c;但是黑底白码就扫不出来&#xff0c;于是就试试反色后的二维码能不能扫描出来&#xff0c;没想到真的可以&#xff0c;下面附上完整代码&#xff1a; <u-icon name"scan&quo…

C语言定义fixed_t什么意思

在 C 语言中&#xff0c;fixed_t 通常是一个自定义的类型别名&#xff08;typedef&#xff09;&#xff0c;用于表示固定点数&#xff08;Fixed-Point Number&#xff09;&#xff0c;而非 C 语言标准库中的原生类型。它主要用于需要高效实数运算但无法使用浮点数的场景&#x…

音频3A处理简介之ANS(自动噪声抑制)

我们常用的手机、消费类摄像头等产品的麦克风所采集的原始声音信号中往往包含了比较多的背景噪音&#xff0c;不仅影响用户录音和回放的使用体验&#xff0c;而且这些噪声数据还会降低音频编码的压缩效率&#xff0c;因此有必要对音频底噪进行抑制处理&#xff0c;这就是ANS&am…

Python 使用期物处理并发(使用concurrent.futures模块启动 进程)

使用concurrent.futures模块启动进程 concurrent.futures 模块的文档 &#xff08;https://docs.python.org/3/library/concurrent.futures.html&#xff09;副标题 是“Launching parallel tasks”&#xff08;执行并行任务&#xff09;。这个模块实现的是真正 的并行计算&…

【系统全面】Linux内核原理——基础知识介绍

理解内核&#xff1a;内核原理 计算机系统的软件分层 不同于单片机中使用代码直接与硬件交互&#xff0c;对于这种方式的缺点深有&#xff1a; &#xff08;1&#xff09;复杂度高&#xff0c;调用难度高&#xff0c;需要深入理解硬件的工作原理和细节。 &#xff08;2&#xf…

Oracle自治事务——从问题到实践的深度解析

一、引言&#xff1a;当“关键操作”遇上主事务的“生死绑定”​先问大家一个问题&#xff1a;假设你在开发一个用户管理系统&#xff0c;核心功能是“用户注册”&#xff0c;同时需要记录“操作日志”。某天&#xff0c;用户提交注册信息时&#xff0c;数据库突然因磁盘空间不…

广播(Broadcast)和组播(Multicast)对比

概述 广播&#xff08;Broadcast&#xff09;和组播&#xff08;Multicast&#xff09;是计算机网络中两种重要的一对多通信方式&#xff0c;用于高效地将数据同时分发给多个接收者&#xff0c;它们的核心区别在于目标接收者的范围和控制精度&#xff0c;基于业务对效率、规模和…

在 HTTP GET 请求中传递参数有两种标准方式

方法 1&#xff1a;URL 查询参数&#xff08;Query Parameters&#xff09;格式&#xff1a;?参数名值&参数名2值2示例请求http://localhost:8080/hello?name张三&age25后端接收方式GetMapping("/hello") public String sayHello(RequestParam String name…

pycharm windows/linux/mac快捷键

适用于mac的快捷键 适用于windows和linux的快捷键 参考资料&#xff1a; https://www.jetbrains.com/zh-cn/help/pycharm/mastering-keyboard-shortcuts.html