类加载器ClassLoad-jdk1.8
类加载器ClassLoad-jdk1.8
- 1. 类加载器的作用
- 2. 类加载器的种类(JDK8)
- 3. jvm内置类加载器如何搜索加载类--双亲委派模型
- 4. 如何打破双亲委派模型--自定义类加载器
- 5. 自定义一个类加载器
- 5.1 为什么需要自定义类加载器
- 5.2 自定义一个类加载器
- 6. java代码加载类的方式
- 7. jdk9 的类加载器结构
- 参考文章
1. 类加载器的作用
- 顾名思义,它是用来加载 Class 的。它负责将 Class 的字节码形式转换成内存形式的 Class 对象。
延迟加载。JVM 运行并不是一次性加载所需要的全部类的,它是按需加载,也就是延迟加载。程序在运行的过程中会逐渐遇到很多不认识的新类,这时候就会调用 ClassLoader 来加载这些类。加载完成后就会将 Class 对象存在 ClassLoader 里面,下次就不需要重新加载了。传递性。程序在运行过程中,遇到了一个未知的类,它会选择哪个 ClassLoader 来加载它呢?虚拟机的策略是使用调用者 Class 对象的 ClassLoader 来加载当前未知的类。何为调用者 Class 对象?就是在遇到这个未知的类时,虚拟机肯定正在运行一个方法调用(静态方法或者实例方法),这个方法挂在哪个类上面,那这个类就是调用者 Class 对象。前面我们提到每个 Class 对象里面都有一个 classLoader 属性记录了当前的类是由谁来加载的。
2. 类加载器的种类(JDK8)

- JVM 中内置了三个重要的 ClassLoader,分别是 BootstrapClassLoader、ExtensionClassLoader 和 AppClassLoader。
- BootstrapClassLoader
- 负责加载 JVM 运行时核心类,这些类位于 JAVA_HOME/lib 目录下
- ExtensionClassLoader
- 负责加载 JVM 运行时扩展类,这些类位于 JAVA_HOME/lib/ext 目录下
- AppClassLoader
- 负责加载用户目录下的class和第三方jar包
- BootstrapClassLoader
3. jvm内置类加载器如何搜索加载类–双亲委派模型
- 实现代码
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 {//如果不存在父类加载器,就检查是否是由启动类加载器加载的类,通过调用本地方法native Class findBootstrapClass(String name)c = findBootstrapClass0(name);}} catch (ClassNotFoundException e) {// 如果父类加载器和启动类加载器都不能完成加载任务,才调用自身的加载功能c = findClass(name);}}if (resolve) {resolveClass(c);}return c;} - 双亲委派逻辑
- 类加载器加载类时,会先判断该类是否加载过,如果加载过则直接返回。否则进行加载(每个父加载器都重复这个过程)
- 类加载器不会直接加载该类,先委派给父类去加载(调用父加载器 loadClass()方法来加载类)
- 当父类返回null,无法加载时,子类尝试加载,如果也加载不到,抛出异常
- 好处
- 避免类的重复加载
- 保证了 Java 的核心 API 不被篡改,如果用户写一个 String 不会被加载
4. 如何打破双亲委派模型–自定义类加载器
- 自定义加载器的话,需要继承
ClassLoader。 - 如果我们不想打破双亲委派模型,就重写
ClassLoader类中的findClass()方法即可,无法被父类加载器加载的类最终会通过这个方法被加载。 - 但是,如果想打破双亲委派模型则需要重写
loadClass()方法。
5. 自定义一个类加载器
5.1 为什么需要自定义类加载器
自定义类加载器是从实际场景出发,解决一些应用上的问题,比如:
- 热部署、插件化类:常用的比如SpringBoot-devtools和Arthas等工具,其实现原理就用到了类加载机制
- 加密:有些核心代码不想公开,但又必须使用,可以通过加密类字节码的方式将编译后的加密代码交给类加载器加载,再采用某种解密算法将真正的类载入JVM,保证核心代码不被反编译泄漏
- 类隔离:在项目中可能不同的微服务用的某个类的版本不一样,某些应用依赖于特定版本的SDK功能,自定义类加载器可以解决某个同名的Class想要加载不同的版本的场景,实现同名Class多版本共存,相互隔离从而达到解决版本冲突的目的。如Java模块化规范 OSGi、蚂蚁金服的类隔离框架
- 非标准化来源加载代码:编译后的字节码在数据库、云端等情况
5.2 自定义一个类加载器
- 待实现…
6. java代码加载类的方式
- 命令行启动应用时候由JVM初始化加载
- 通过
Class.forName()方法动态加载 - 通过
ClassLoader.loadClass()方法动态加载 - 自定义加载器,调用它的
MyClassLoader.loadClass()方法
7. jdk9 的类加载器结构

参考文章
- https://javaguide.cn/java/jvm/classloader.html#%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D
- https://blog.csdn.net/xyang81/article/details/7292380
- https://gityuan.com/2016/01/24/java-classloader/
- https://zhuanlan.zhihu.com/p/51374915
- https://blog.csdn.net/chengqiuming/article/details/119835564
- https://pdai.tech/md/java/jvm/java-jvm-classload.html
相关文章:
类加载器ClassLoad-jdk1.8
类加载器ClassLoad-jdk1.8 1. 类加载器的作用2. 类加载器的种类(JDK8)3. jvm内置类加载器如何搜索加载类--双亲委派模型4. 如何打破双亲委派模型--自定义类加载器5. 自定义一个类加载器5.1 为什么需要自定义类加载器5.2 自定义一个类加载器 6. java代码加…...
24年最新AI数字人简单混剪
24年最新AI数字人简单混剪 网盘自动获取 链接:https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码:0b8x...
免备案香港主机会影响网站收录?
免备案香港主机会影响网站收录?前几天遇到一个做电子商务的朋友说到这个使用免备案香港主机的完整会不会影响网站的收录问题,这个问题也是站长关注较多的问题之一。小编查阅了百度官方规则说明,应该属于比较全面的。下面小编给大家介绍一下使用免备案香…...
低代码工业组态数字孪生平台
2024 两会热词「新质生产力」凭借其主要特征——高科技、高效能及高质量,引发各界关注。在探索构建新质生产力的重要议题中,数据要素被视为土地、劳动力、资本和技术之后的第五大生产要素。数据要素赋能新质生产力发展主要体现为:生产力由生产…...
代码随想录第三十八天(完全背包问题)|爬楼梯(第八期模拟笔试)|零钱兑换|完全平方数
爬楼梯(第八期模拟笔试) 该题也是昨天的完全背包排列问题,解法相同,将遍历顺序进行调换 import java.util.*; public class Main{public static void main (String[] args) {Scanner scnew Scanner(System.in);int nsc.nextInt(…...
idea常用知识点随记
idea常用知识点随记 1. 打开idea隐藏的commit窗口2. idea中拉取Git分支代码3. idea提示代码报错,项目编译没有报错4. idea中实体类自动生成序列号5. idea隐藏当前分支未commit代码6. idea拉取新建分支的方法 1. 打开idea隐藏的commit窗口 idea左上角File→Settings…...
(双指针) 有效三角形的个数 和为s的两个数字 三数之和 四数之和
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、有效三角形的个数(medium) 1.1、题目 1.2、讲解算法原理 1.3、编写代码 二、和为s的两个数字 2.1、题目 2.2、讲解算…...
力扣每日一题114:二叉树展开为链表
题目 中等 提示 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…...
Linux系统下使用LVM扩展逻辑卷的步骤指南
Linux系统下使用LVM扩展逻辑卷的步骤指南 文章目录 Linux系统下使用LVM扩展逻辑卷的步骤指南前言一、逻辑卷管理(LVM)简介二、扩展逻辑卷步骤1. 检查当前的磁盘布局2. 创建新的分区3. 更新内核的分区表4. 初始化新的物理卷5. 将物理卷添加到卷组6. 调整逻…...
探索AI编程新纪元:从零开始的智能编程之旅
提示:Baidu Comate 智能编码助手是基于文心大模型,打造的新一代编码辅助工具 文章目录 前言AI编程概述:未来已来场景需求:从简单到复杂,无所不包体验步骤:我的AI编程初探试用感受:双刃剑下的深思…...
RustGUI学习(iced)之小部件(三):如何使用下拉列表pick_list?
前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第三篇,主要讲述下拉列表pick_list部件的使用,会…...
【OceanBase诊断调优】—— Unit 迁移问题的排查方法
适用版本:V2.1.x、V2.2.x、V3.1.x、V3.2.x 本文主要介绍 OceanBase 数据集在副本迁移过程中遇到的问题的排查方法。 适用版本 V2.1.x、V2.2.x、V3.1.x、V3.2.x 手动调度迁移问题的排查 OceanBase 数据库的 RootService 模块负责 Unit 迁移的调度,如果…...
[极客大挑战 2019]PHP
1.通过目录扫描找到它的备份文件,这里的备份文件是它的源码。 2.源码当中涉及到的关键点就是魔术函数以及序列化与反序列化。 我们提交的select参数会被进行反序列化,我们要构造符合输出flag条件的序列化数据。 但是,这里要注意的就是我们提…...
数据结构之跳跃表
跳跃表 跳跃表(skiplist)是一种随机化的数据, 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出, 跳跃表以有序的方式在层次化的链表中保存元素, 效率和平衡树媲美 —— …...
搜维尔科技:动作捕捉解决方案:销售、服务、培训和支持
动作捕捉解决方案:销售、服务、培训和支持 搜维尔科技:动作捕捉解决方案:销售、服务、培训和支持l...
数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)
数据库管理184期 2024-05-07 数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)1 JSON需求2 关系型表设计3 JSON关系型二元性视图3 查询视图总结 数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20…...
刷代码随想录有感(58):二叉树的最近公共祖先
题干: 代码: class Solution { public:TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q){if(root NULL)return NULL;if(root p || root q)return root;TreeNode* left traversal(root->left, p, q);TreeNode* right traversal(r…...
[开发|安卓] Android Studio 开发环境配置
Android Studio下载 Android Studio下载地址 下载SDK依赖 1.点击左上角菜单 2.选择工具 3.打开SDK管理中心 4.下载项目目标Android版本的SDK 配置安卓虚拟机 1.打开右上角的设备管理 2.选择合适的手机规格 3.下载并选择项目目标Android系统 4.点击完成配置 …...
开发 Chrome 浏览器插件入门
目录 前言 一,创建插件 1.创建一个新的目录 2.编写清单文件 二,高级清单文件 1.编写放置右窗口 2.常驻的后台JS或后台页面 3.event-pages 短周期使用 三,Chrome 扩展 API 函数 1.浏览器操作函数 2.内容脚本函数 3.后台脚本函数 4…...
在数字化转型的浪潮中,CBDB百数服务商如何破浪前行?
在信息化时代,传统咨询企业面临着数字化转型的挑战与机遇。如何利用数字化技术提升业务效率、增强客户黏性,成为了行业关注的焦点。云南析比迪彼企业管理有限公司(CBDB)作为云南地区的企业咨询服务提供商,率先与百数展…...
OpenCascade实战:TopoDS_Shape数据结构的高效遍历与优化策略
1. TopoDS_Shape数据结构基础解析 在OpenCascade中,TopoDS_Shape是构建三维模型的基石。这个看似简单的类实际上包含了三个关键数据成员:myTShape、myLocation和myOrient。理解这三个字段的运作机制,是高效操作模型的前提。 myTShape是一个智…...
腰间盘突出别硬扛!阶梯治疗才科学,专科诊疗帮你摆脱疼痛
腰间盘突出是现代人的常见病,很多人要么强忍疼痛,要么盲目按摩,结果越治越重。作为从事脊柱外科多年的专家,我要告诉大家:腰间盘突出治疗有明确的阶梯方案,从保守到手术循序渐进,关键是选对时机…...
华为OD机考双机位C卷 - 数字游戏 (Java)
# 数字游戏 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录(Java)点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(Java题解) 题目描述 小明玩一个游戏。 系统发1+n张牌,每张牌上有一个整数。 第一张给…...
Linux内核核心机制与开发实践详解
1. Linux内核概述与预备知识Linux内核作为操作系统的核心组件,承担着管理硬件资源、提供系统服务的关键角色。要深入理解Linux内核,需要具备以下基础知识储备:C语言能力:内核代码90%以上由C语言编写,需掌握指针操作、内…...
BMC监控实战:用Python+IPMI打造服务器硬件健康巡检系统
BMC监控实战:用PythonIPMI打造服务器硬件健康巡检系统 当服务器机房的报警铃声在深夜响起,运维团队最需要的是快速定位问题根源——是CPU过热触发了保护机制?还是某个风扇模块突然停转?传统的人工巡检方式在现代化数据中心早已力不…...
前端Word文档生成革命:3分钟掌握纯JavaScript专业文档导出创新方案
前端Word文档生成革命:3分钟掌握纯JavaScript专业文档导出创新方案 【免费下载链接】DOCX.js Generate Microsoft Word DOCX files in pure client-side JavaScript. Try in Chrome 项目地址: https://gitcode.com/gh_mirrors/do/DOCX.js 还在为Word文档导出…...
Koikatu HF Patch完整安装指南:5步轻松解锁游戏全部潜力
Koikatu HF Patch完整安装指南:5步轻松解锁游戏全部潜力 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch 还在为Koikatu游戏体验不完整…...
Realistic Vision V5.1 惊艳作品集:基于卷积神经网络的人像摄影风格迁移
Realistic Vision V5.1 惊艳作品集:基于卷积神经网络的人像摄影风格迁移 你有没有想过,自己随手拍的一张普通自拍照,也能变成一张充满电影感、艺术气息的专业级人像作品?这听起来像是专业摄影师和后期修图师的专属魔法࿰…...
像素皇城·灵蛇贺岁效果展示:红白机美学融合皇城大门的AI春联生成作品
像素皇城灵蛇贺岁效果展示:红白机美学融合皇城大门的AI春联生成作品 1. 项目概览 Pixel Couplet Gen是一款基于ModelScope大模型开发的创新型春联生成工具。与传统春联设计不同,我们大胆采用了8-bit像素游戏风格,将经典红白机视觉元素与中国…...
漫画翻译效率提升300%:深度学习辅助工具实战指南
漫画翻译效率提升300%:深度学习辅助工具实战指南 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered by deeplearning 项目地址: https://git…...
