类加载器与模块化系统

这篇具有很好参考价值的文章主要介绍了类加载器与模块化系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 1 类加载器

“类加载器”是实现应用程序自己决定如何去获取所需的类这个动作的代码。

1.1 类与类加载器

比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义。否则,即使这两个类来源同一个Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那么这两个类就必定不相等。

1.2 双亲委派模型

JDK8及之前版本,绝大多数Java程序都会使用到以下3个系统提供的类加载器来进行加载。

启动(引导)类加载器

Bootstrap Class Loader

负责加载存放在<JAVA_HOME>\lib目录,或者被-Xbootclasspath参数所指定的路径中存放的,而且是Java虚拟机能够识别的。 如果需要把加载请求委派给启动类加载器去处理,那直接使用null代替即可。

扩展类加载器

Extension Class Loader

Java代码实现。负责加载<JAVA_HOME>\lib\ext目录中,或者被java.ext.dirs系统变量所指定的路径中所有的类库。

应用程序类加载器

Application Class Loader

Java代码实现,负责加载用户类路径(ClassPath)上所有的类库。如果应用程序中没有自定义过自己的类加载器,一般情况下这就是程序中默认的类加载器。

类加载器与模块化系统

图 类加载器之间的协作关系

双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。这里的父子关系一般不是以继承的关系来实现的,而是通常使用组合关系来复用父加载器的代码。

类加载器与模块化系统

图 双亲委派模型工作过程

双亲委派模型一个显而易见的好处就是Java中的类随着它的类加载器一起具备了一种带有优先级的层次关系。

1.3 破坏双亲委派模型

直到Java模块化出现为止,双亲委派模型出现过3次较大规模“被破坏”的情况。

1.3.1 JDK1.2版本之前

双亲委派模型是在JDK1.2之后才被引入,而抽象类ClassLoader则在Java第一个版本就存在,用户在编写自定义类加载器时,可能会覆盖loadClass方法,从而破坏双亲委派机制。

类加载器与模块化系统

图 用户自定义类加载器覆盖loadClass方法

解决措施是在Jdk1.2后,引入findClass方法,推荐用户自定义类加载器时重写这个方法而不是loadClass方法。

类加载器与模块化系统

图 ClassLoader类中的loadClass方法

1.3.2 模型自身缺陷导致

双亲委派很好地解决了各个类加载器协作时基础类型的一致性问题(越基础的类由越上层的加载器进行加载)。但是,如果有基础类型需要调用用户代码的时候,这个模型将会被破坏。

比如连接数据库。JDK提供了一组规范和接口,各个不同数据库厂商按照这个接口去实现自己的类库。按照双亲委派模型,JDK的代码包中的加载使用的是启动类加载器,但是厂商自定义的类库,不可能使用启动类加载器加载。

数据库连接服务使用线程上下文类加载器去加载所需的厂商自定义代码。这是一种父类加载器去请求子类加载器完成类加载的行为。

1.3.3 用户对程序动态性的追求导致

框架在实现模块化热部署的关键是自定义类加载器机制的实现。而这些自定义类加载器的加载规则大部份不符合双亲委派模型。文章来源地址https://www.toymoban.com/news/detail-447956.html

到了这里,关于类加载器与模块化系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】用函数实现模块化程序设计

    前言:如果把所有的程序代码都写在一个主函数( main函数 )中,就会使主函数变得庞杂、头绪不清,使阅读和维护程序变得困难。此外,有时程序中要多次实现某一功能,如果重新编写实现此功能就会使得程序冗长、不精炼。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分

    2024年02月08日
    浏览(147)
  • 探究 Node.js 中的模块化实现方式

    简介 : 在现代的软件开发中,模块化是一种重要的编程范式。Node.js作为一种基于 JavaScript 运行时的环境,也支持模块化开发。本文将深入探讨 Node.js 中的模块化实现方式,包括 CommonJS 规范和 ES 模块规范,并介绍它们的特点、使用方法以及在实际开发中的应用。 正文: Co

    2024年02月08日
    浏览(65)
  • 函数探秘:深入理解C语言函数,实现高效模块化编程

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 在数学中我们就知道了函数这个概念,而C语言同样引入了函数这个概念,那C语言的函数到底是什么样的呢? 在C语言中, 函数也叫子程序,它是一段可以

    2024年03月09日
    浏览(70)
  • 最新模块化设计小程序系统源码完整版:开源可二开,支持DIY

    随着互联网的快速发展,小程序已成为各行各业开展业务的重要工具。而模块化设计小程序系统源码完整版则是一种高效、灵活、易维护的解决方案。 分享一个最新的模块化设计小程序系统源码完整版,源码开源可二开,支持自由DIY设计,含完整的前后端和详细的搭建部署教

    2024年02月07日
    浏览(53)
  • 一个基于.NET Core构建的简单、跨平台、模块化的商城系统

    今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。 商品:分类、品牌、单位、选项(销售属性)、属性、属性模板、属性组。 销售:订单、物流。 内容:首页配置、评论、回复。 配置:国家、用户、仓库

    2024年03月27日
    浏览(211)
  • IBM引入模块化设计助力波音与摩根大通快速实现量子计算服务

    ​(图片来源:网络) 经典计算机具有局限性,无法完成某些特定任务,例如准确预测金融市场或开发药物来对抗新兴疾病,而量子计算能打破“僵局”。 部署IBM Quantum量子系统的负责人Chris Lirakis 说:“量子计算不仅提高了速度,而且能解决我们以前无法解决的问题。”

    2024年02月05日
    浏览(75)
  • Flask 高级应用:使用蓝图模块化应用和 JWT 实现安全认证

    本文将探讨 Flask 的两个高级特性:蓝图(Blueprints)和 JSON Web Token(JWT)认证。蓝图让我们可以将应用模块化,以便更好地组织代码;而 JWT 认证是现代 Web 应用中常见的一种安全机制。 在大型应用中,一个单独的 Python 文件可能无法容纳所有的路由和视图函数。这时,Flask 的

    2024年02月13日
    浏览(46)
  • umicv cv-summary1-全连接神经网络模块化实现

    全连接神经网络模块化实现 Linear与Relu单层实现 LossLayer实现 多层神经网络 不同梯度下降方法 Dropout层 今天这篇博文针对Assignment3的全连接网络作业,对前面学习的内容进行一些总结 在前面的作业中我们建立神经网络的操作比较简单,也不具有模块化的特征,在A3作业中,引导

    2024年02月08日
    浏览(42)
  • 一种改进多旋翼无人机动态仿真的模块化仿真环境研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、Simulink实现

    2024年02月10日
    浏览(54)
  • JDK 9 模块化系统 (Module System) 和 多版本兼容 Jar (Multi-Release Jar)

    博文目录 Java 9引入了模块化系统的主要原因是为了解决Java平台面临的复杂性和可维护性方面的挑战。以下是一些采用模块化系统的主要原因: 更好的代码组织:传统的Java应用程序通常由大量的JAR文件组成,这些JAR文件之间的依赖关系可能变得非常复杂。模块化系统允许开发

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包