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

JVM深入浅出(8)--- 类加载器

类加载器最重要的功能就是加载的过程,也就是通过完全限定名去获得一个class对象的二进制流。

1. 类与类加载器

在jvm中,是通过类本身和加载类的类加载器来确认一个类的唯一性。每一个类加载器,都有它的类名称空间。

2. 双亲委派模型

类加载器(没有模块化之前):

  • 启动类加载器(Bootstrap classloader): C++实现的,是jvm的一部分,访问的时候返回值是null。
    • 启动类加载器负责加载 <JAVA_HOME>\lib 目录,或者被-Xbootclasspath参数所指定的路径中存放的
  • 扩展类加载器(Extension Class Loader)
    • 负责加载\lib\ext目录中,或者被java.ext.dirs系统变量所 指定的路径中所有的类库,可以在程序中直接使用该加载器加载
  • 应用程序类加载器(Application Class Loader):
    • 负责加载用户类路径 (ClassPath)上所有的类库,开发者同样可以直接在代码中使用这个类加载器。如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
  • 自定义类加载器:用户可以通过重写loadclass()/findclass()方法实现

image-20260213200229826

双亲委派模型:各类加载器之间的关系组成了双亲委派模型,双亲委派模型除了启动类加载器,要求其他加载器都有自己的父加载器,不过这里的父子关系不是继承实现,通常是组合关系复用父加载器的代码

  • 双亲委派模型的工作过程:
    • 当一个加载器收到加载某个类的请求,先不自己去处理这个类的加载,而是将请求委派给父加载器去加载这个类,如果父加载器反馈无法加载这个类(它的搜索范围中没有找到所需的类),再自己来加载这个类。
  • 双亲委派模型的好处:
    • 保证了加载类的唯一性,就好比Object类,如果用户也写了个Object类,jvm由于双亲委派模型,永远都会用启动类加载器去加载这个类,也就确保了加载类的唯一性,保证java程序稳定运行。
//双亲委派模型的实现
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{// 首先,检查请求的类是否已经被加载过了Class c = findLoadedClass(name);if (c == null) {try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// 如果父类加载器抛出ClassNotFoundException// 说明父类加载器无法完成加载请求}if (c == null) {// 在父类加载器无法加载时// 再调用本身的findClass方法来进行类加载c = findClass(name);}}if (resolve) {resolveClass(c);}
}

3.破坏双亲委派模型

  • 第一次破坏:由于双亲委派模型在JDK1.2推出,但是在这之前已经有了类加载器的概念,为了让用户能重写类加载器而不破坏双亲委派模型,鼓励开发者重写 findclass(),而不是loadclass()方法(里面有双亲委派寻找父加载器的逻辑)

  • 第二次破坏:父加载器加载的类,需要调用子加载器加载类中的API,这种父加载器肯定是不认识子加载器的类的,所以推出了线程上下文加载器

  • 第三次“被破坏”是由于用户对程序动态性的追求而导致的

http://www.jsqmd.com/news/603317/

相关文章:

  • 告别样品分类烦恼:微谱高通量微波消解仪如何大幅提升实验室效率? - 品牌推荐大师1
  • 传感器工作原理图解与应用指南
  • java新手福音,用快马ai生成你的第一份个性化学习路线与练习项目
  • G-Helper:华硕笔记本性能控制的终极解决方案
  • 保姆级避坑指南:用Anaconda和Xinference在Windows上部署LangChain-Chatchat(附解决httpx报错)
  • 敏捷测试实践:两周一个迭代的质量保障
  • 2026年选购指南:低脉动隔膜液泵哪个品牌质量好、性能强? - 品牌推荐大师
  • 点云密度计算
  • 在 .NET 中使用 Moonshot Kimi + AgentFramework:从 SDK 到 Agent 的完整实践
  • OpenClaw性能调优:千问3.5-9B批量任务并发控制策略
  • 2026年最新资源!十大电商主图与跨境电商图片素材网站推荐 - 品牌2025
  • Music Tag Web:一站式智能音乐标签管理解决方案
  • IGBT(绝缘栅双极型晶体管)的工作原理与典型应用场景解析
  • 5个实战技巧深度掌握KeymouseGo跨平台自动化工具
  • 【无锡家长血泪忠告】毕业照只认夏末!无锡第一 - 新闻快传
  • 2026最新十大高清免费版权图片素材网站推荐,支持免费下载与商用 - 品牌2025
  • 告别重复造轮子:用快马生成高效配对模块提升开发效率
  • 实战演练:基于快马生成openclaw启动的视觉分拣系统完整项目
  • 如何在 Laravel Excel 导入时检测并阻止重复列值
  • 2026夏季男士清凉之战:从透气,导湿,速干角度,盘点五款夏季通勤裤品牌 - 行业深度观察
  • 2026年抖音推广选购指南:三招教你省钱选对沈阳口碑服务 - 精选优质企业推荐榜
  • 2026年必看!十大快消品图片素材下载网站及样机素材网站推荐,轻松搞定产品设计 - 品牌2025
  • 免费通票开抢!HOW 2026 出品人优惠码发放中
  • 快速上手BERT文本分割:无需代码,Web界面一键处理访谈/会议记录
  • Unity游戏多语言解决方案:XUnity.AutoTranslator实战指南
  • 终极指南:DxWrapper让经典游戏在Windows 10/11上完美运行
  • AI训练素材与数据集供应商怎么选?卓特视觉合规AI数据解决方案 - 品牌2025
  • LFM2.5-1.2B-Thinking-GGUF在不同硬件平台的性能对比:从CPU到边缘计算设备
  • 提升picoclaw项目调试效率:用快马AI自动生成参数调试与可视化工具
  • 从诊断请求到刷写:一条CAPL脚本串联CANoe诊断全流程(含DoIP/vFlash)