jvm:类加载器

news/2025/3/19 20:38:03/文章来源:https://www.cnblogs.com/xiaoxianglu/p/18781749

类加载器

  • 加载器列表:

    加载哪的类 说明
    Bootstrap ClassLoader java_home/jre/lib 无法直接访问
    Extension ClassLoader java_home/jre/lib/ext 上级为Bootstrap,显示为null
    Application ClassLoader classpath 上级为Extension
    自定义类加载器 自定以 上级为Application
    • 存在一个层级关系:会优先询问上级是否已经加载;
  • 启动类加载器,Bootstrap ClassLoader:

  • 扩展类加载器,Exception ClassLoader:

  • 双亲委派:指调用类加载器的loaderClass方法时,查找类的规则;

    • 双亲,更应该翻译为上级更为合适,因为它并没有继承关系,

      1. 检查该类是否已经被本加载器加载;

      2. 如果没有被加载,判断是否有上级:

        1. 有上级,在递归调用上级的loadClass();
        2. 如果没有上级,则由Bootstrap ClassLoader加载;
      3. 到自己类加载里面,加载,否则报错;

        通过报错跳出递归,进入下级寻找;

    • 双亲委派类加载器:

      • mysql的DriverManager是由启动类加载器,加载,其中指明了加载驱动Driver方法;
      • 但是驱动Driver不在启动加载路径下,所以在Driver加载中,明确使用了应用加载器【Application ClassLoader】;
  • 线程上下文类加载【ContextClassLoader】:

    • ContextClassLoader:是当前线程使用的类加载,默认是应用程序类加载器,
    • 在每个线程启动的时候,jvm默认把应用程序加载器赋值给当前线程;
  • 自定义类加载器:

    • 什么时候需要自定义加载器:
      1. 想要加载非classpath随意路径中的类文件;
      2. 面向接口编程,希望解耦,常用在框架设计;
      3. 希望隔离不同版本,不同应用的同类型都可以被加载,不冲突,常见于tomcat容器;
    • 实现步骤:
      1. 继承ClassLoader父类;
      2. 遵从双亲委派机制,需要重写findClass方法;
      3. 读取类文件的字节码;
      4. 调用父类的defineClass方法来加载类;
      5. 使用该类加载器的loadClass方法;
    • 确定类相同:包名+类名+类加载器【对象】,三者相同;
      • 因此通过内加载器不是同一个对象,判定不是相同类,从而实现了隔离;
      • 通常情况下,启动类加载器,扩展应用加载器和应用类加载器都是单例实例化;

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

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

相关文章

听见未来,Audio+AI | GAS 2025完整议程揭晓!

听见未来,Audio+AI 2025中国国际音频产业大会(GAS) 将于 3月26-27日 在上海张江科学会堂盛大举办!大会主题聚焦聚焦“听见未来,Audio+AI”,两场主旨论坛、八场专题论坛。内容覆盖电子产业热点领域及方向,分别包括音频+AI、智能车载 音频、线上智能交互、智能耳机与可穿戴…

C++容器

容器的分类分为顺序容器(sequence) 关联容器(asscoiative) 无序容器(unordered) 顺序容器Array、vector、deque、list 关联容器有(mul)set和(mul)map,set和map的区别在于,set的key就是value,而map的key和value是分开的,set和map内部都是通过红黑树实现 无序容器主要为…

.NET Core奇技淫巧之WinForm使用Python.NET并打包

前言 之前整了一个GZY.EFCoreCompare 的库,可以用做对比实体与数据库结构.感兴趣可以去看看,地址:GZY.EFCoreCompare 但是只能导出execl表格. 后来大佬用Python写了个类,可以将execl表格直接生成SQL语句. 但是需要通过开发工具 或者python环境去运行. 对现场的非技术人员很不友…

MCP Server 开发实战指南(Python版)

原文链接:https://www.ryanzoe.top/ai/mcp-server-%e5%bc%80%e5%8f%91%e6%95%99%e7%a8%8b/ MCP 官方文档https://modelcontextprotocol.io/introduction各个 clients 对 MCP 的支持情况https://modelcontextprotocol.io/clientsMCP Python SDK:MCP Client 和 Server 官方 SDK…

Amphion 推出合成音频鉴别系统 Auditi;Gemini 引入 NotebookLM 功能,生成文档、网页音频摘要丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

洛谷题单指南-图论之树-P3398 仓鼠找 sugar

原题链接:https://www.luogu.com.cn/problem/P3398 题意解读:一颗n个节点的树,m个判断,判断树上两条路径是否相交,相交输出Y,否则输出N 解题思路:此题需要画一棵多叉树来辅助判断多次观察相交的路径,可以得出一个关键性质: 两条路径相交,必然有一条路径的LCA在另一条…

lg 主页

\(\Large\text{My Blog}\)中学:济南天山高级实验中学 关于我的学校究极久远预告:寒假游记滚滚长江东逝水,浪花淘尽英雄 是非成败转头空 青山依旧在,几度夕阳红 白发渔樵江渚上,观看秋月春风 一壶浊酒喜相逢 古今多少事,都付笑谈中街喧闹,人过往 且记曾相识,莫为少年留 …

day:25 selenium之介绍和环境配置

一、selenium介绍 selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试和验证 (2)减少测试人员在回归测试时用例漏测和验证点的漏测 (3…

[算法学习记录] [更新中]最短路

顾名思义,最短路算法,就是求一个图中所有的点距某一个点的最短距离,常见的有Dijkstra算法、Bellman-Ford算法、Johnson算法与Floyd算法。 Dijkstra Dijistra算法实际上是一种由贪心与动态规划结合的算法,我们每次都贪心地选择到某个点的最近距离,又动态地更新着距离数组d的…

day6-static静态变量

静态变量/静态方法 被static修饰 工具类静态方法不能调用非静态。 非静态可以访问所有。 继承一个子类只能继承一个父类,可以多层继承,最大的父类为Objectcoding 练习:更好的方法:双指针不浪费空间

SpringBoot引入JWT实现用户校验

一JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。这些信息以JSON对象的形式存储在令牌中,并且可以被签名和加密。JWT通常用于身份验证和信息交换主要用途 身份验证:当用户登录成功后,服务器会生成一个JWT并返回给客户端。之后…

mcp-playwright测评

mcp-playwright介绍 mcp-playwright是一个使用 Playwright 提供浏览器自动化能力的模型上下文协议服务器。该服务器使 LLMs 能够与网页交互、截屏,并在真实的浏览器环境中执行 JavaScript。 GitHub地址:https://github.com/executeautomation/mcp-playwright。安装 npm insta…