jvm基础三——类加载器

类加载器

在Java中,类加载器(Class Loader)是Java虚拟机(JVM)的一部分,负责将类文件(.class文件)加载到JVM中,使得程序能够使用这些类。类加载器在Java中具有重要的作用,它的主要任务包括:

  1. 加载(Loading):找到并加载类文件的字节码数据。类加载器根据类的全限定名(Fully Qualified Name)来查找并读取对应的类文件。

  2. 链接(Linking):链接包括验证、准备和解析这三个步骤。

    • 验证(Verification):确保类文件的字节码符合JVM规范,并且安全地加载到JVM中。
    • 准备(Preparation):为类的静态变量分配内存,并设置默认初始值。
    • 解析(Resolution):将符号引用转换为直接引用。
  3. 初始化(Initialization):对类进行初始化,包括执行静态代码块和初始化静态变量等。

Java的类加载器采用了双亲委派模型(Parent Delegation Model)。根据这个模型,当需要加载一个类时,类加载器首先会委派给父类加载器加载,只有在父类加载器无法加载该类时,才会尝试自己加载。这种层次化的类加载器体系保证了类的统一性和安全性,同时也避免了类的重复加载。

Java中的类加载器可以分为以下几种类型:

  1. Bootstrap Class Loader(引导类加载器):是JVM的一部分,它负责加载JVM自身需要的类,包括java.lang包中的类。它是用本地代码(Native Code)实现的,无法直接在Java中获取对其的引用。

  2. Extension Class Loader(扩展类加载器):负责加载Java的扩展库,位于JRE的lib/ext目录下的类。它是由sun.misc.Launcher$ExtClassLoader类实现的,是Bootstrap Class Loader的子类。

  3. Application Class Loader(应用程序类加载器):也叫系统类加载器,负责加载应用程序中的类。它是由sun.misc.Launcher$AppClassLoader类实现的,是Extension Class Loader的子类。

  4. 自定义类加载器:Java允许用户自定义类加载器,继承自java.lang.ClassLoader类,实现自定义的加载逻辑。通过自定义类加载器,可以实现一些特殊的类加载需求,比如从网络、数据库或其他非标准位置加载类。

Java的类加载器机制为Java程序提供了灵活性和安全性,可以根据不同的需求扩展或自定义类加载器,实现各种复杂的类加载逻辑

 

类加载器的双亲委派机制 

Java中的类加载器采用了双亲委派机制(Parent Delegation Model),这是一种类加载器的工作原则,用于保证类加载的统一性和安全性。该机制基于一个简单的原则:除非父类加载器无法加载该类,否则由父类加载器加载。

下面是双亲委派机制的工作流程:

  1. 当一个类加载器收到加载类的请求时,它首先不会自己尝试去加载这个类,而是把请求委托给父类加载器去完成。

  2. 每个类加载器都会把加载请求向上委托给父类加载器,直到达到顶层的引导类加载器(Bootstrap Class Loader)。

  3. 如果父类加载器可以加载这个类,就成功返回;如果父类加载器无法加载,子类加载器才会尝试自己去加载这个类。

这种机制的优势在于确保了Java核心库的一致性:无论哪个类加载器加载一个类,最终被加载的类都是相同的。这样可以避免在不同的类加载器下出现同名类的冲突问题。

双亲委派机制还提高了安全性。因为在这种机制下,Java类的加载都是从根加载器开始的,根加载器只加载标准的核心Java类库,不会加载应用程序的类。这样可以防止应用程序通过替换核心Java类库中的类来破坏JVM的稳定性和安全性。

总的来说,双亲委派机制保证了类加载的一致性、安全性和稳定性,是Java类加载机制的核心之一。

打破

尽管双亲委派机制在大多数情况下都是非常有用的,但在某些特殊情况下,可能需要打破双亲委派机制。打破双亲委派机制通常是为了实现一些特殊的类加载需求,比如热部署、动态更新等。

在Java中,要打破双亲委派机制,一般需要自定义类加载器,并重写其加载类的方法。下面是一种可能的方法:

  1. 自定义类加载器:继承自 ClassLoader 类,并重写 loadClass() 方法

  2. loadClass() 方法中,根据需要的加载策略,决定是否调用父类加载器的 loadClass() 方法。

  3. 如果需要打破双亲委派机制,可以在自定义类加载器的 loadClass() 方法中直接加载指定类,而不是委托给父类加载器。

下面是一个简单的示例代码,演示如何打破双亲委派机制:

public class MyClassLoader extends ClassLoader {@Overridepublic Class<?> loadClass(String name) throws ClassNotFoundException {if (name.startsWith("com.example")) {// 对于指定的类,直接由自定义类加载器加载return findClass(name);}// 其他类委托给父类加载器加载return super.loadClass(name);}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {// 实现自定义的类加载逻辑,比如从文件或网络加载类的字节码数据// 这里只是一个简单示例,实际应用中需要根据具体需求实现byte[] classData = getClassData(name);if (classData == null) {throw new ClassNotFoundException(name);}return defineClass(name, classData, 0, classData.length);}// 实现获取类字节码数据的方法,这里只是一个简单示例,实际应用中需要根据具体需求实现private byte[] getClassData(String name) {// 从指定的位置获取类字节码数据// 这里可以是文件、网络等来源return null;}
}

在上面的示例中,自定义了一个 MyClassLoader 类继承自 ClassLoader,重写了 loadClass() 方法和 findClass() 方法。在 loadClass() 方法中,指定了对于以 "com.example" 开头的类,直接由自定义类加载器加载,而对于其他类,委托给父类加载器加载。在 findClass() 方法中,实现了加载类的具体逻辑,可以从指定的位置获取类的字节码数据并定义类。

需要注意的是,打破双亲委派机制可能会导致类加载冲突和安全问题,因此应谨慎使用,并确保了解其潜在的影响。

 

 

 

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

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

相关文章

6 种事件驱动的架构模式

事件驱动架构(Event-Driven Architecture)是一种基于事件和事件处理的软件架构&#xff0c;它的核心思想是将系统的行为和逻辑抽象成一系列事件&#xff0c;这些事件在系统中按照一定的规则和顺序产生和传播&#xff0c;并被相应的处理器处理。事件驱动架构具有高度的灵活性、可…

【数据结构】考研真题攻克与重点知识点剖析 - 第 3 篇:栈、队列和数组

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

LogicFlow 在HTML中的引入与使用

LogicFlow 在HTML中的引入与使用 LogicFlow的引入与使用&#xff0c;相较于BPMNJS相对容易一些&#xff0c;更加灵活一些&#xff0c;但是扩展代码可能写得更多一些。 示例展示 使用方式 这个的使用方式就简单很多了&#xff0c;利用cdn把js下载下来&#xff0c;引入到HTML文…

c语言之向main函数传递参数

在c语言中&#xff0c;main函数也是可以传递传递参数的&#xff0c;业内向main函数传递参数的格式是 main(int argc,char *argv[]) 向main函数传递参数不是通过代码传递的&#xff0c;一般是通过dos命令传递 举个例子 #include<stdio.h> void main(int argc,char *ar…

PyTorch之计算模型推理时间

一、参考资料 如何测试模型的推理速度 Pytorch 测试模型的推理速度 二、计算PyTorch模型推理时间 1. 计算CPU推理时间 import torch import torchvision import time import tqdm from torchsummary import summarydef calcCPUTime():model torchvision.models.resnet18()…

使用pip install替代conda install将packet下载到anaconda虚拟环境

问题描述 使用conda install 下载 stable_baseline3出现问题 一番搜索下是Anaconda.org缺少源 解决方法 首先使用管理员权限打开 anaconda prompt 然后激活目标环境&#xff1a;conda activate env_name 接着使用&#xff1a;conda env list查看目标env的位置 如D:\anacon…

2023.4.7 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、过去方案和Motivation 4、Segment Anything模型 5、创新点 6、实验过程 7、实验结果 1、评价绩效 2、检测评价 3、跟踪评价 8、 结论 总结 引言 本周阅读了一篇关于高效的任意分割模型的文献&#xff0c;用于自…

JVM基础:类的生命周期详解

JDK版本&#xff1a;jdk8 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 一. 生命周期概述二. 加载阶段(Loading)2.1 加载步骤2.2 查看内存中的对象 三. 连接阶段(Linking)3.1 连接之验证3.2 连接之准备3.3 连接阶段之解析 四. 初始化阶段(Initialization)4.1 单个类的…

Arcgis Pro地理配准

目录 一、目的 二、配准 1、找到配准工具 2、添加控制点 3、选择控制点 4、添加更多控制点 5、配准完成、保存 三、附录 1、查看控制点或删除控制点 2、效果不好怎么办 一、目的 下面我们将两张地图进行配准&#xff0c;其中一张有地理位置&#xff0c;而另外一张没…

前端面试高频: 理解 React/Vue 中 Key 的作用

一: 引言 在 React 或 Vue 项目中&#xff0c;我们经常在列表组件中使用key属性。key是给每一个vnode的唯一id&#xff0c;它在列表渲染和虚拟 DOM 操作中扮演着重要的角色。 当我们在渲染一个包含多个相同子组件的列表时&#xff0c;如果没有使用 key&#xff0c;React 或 Vue…

666666666666666666

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Linux (Ubuntu)- mysql8 部署

目录 1.基本部署 2.修改密码 3.开启root可远程连接配置 1.基本部署 01》》先查看OS类型&#xff0c;如果是Ubuntu在往下边看 rootspray:/etc/mysql/mysql.conf.d# lsb_release -a LSB Version: core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch Distributor ID: …

备战蓝桥杯---线段树应用2

来几个不那么模板的题&#xff1a; 对于删除&#xff0c;我们只要给那个元素附上不可能的值即可&#xff0c;关键问题是怎么处理序号变化的问题。 事实上&#xff0c;当我们知道每一个区间有几个元素&#xff0c;我们就可以确定出它的位置&#xff0c;因此我们可以再维护一下前…

RK3568测试

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

非关系型数据库------------Redis的安装和部署

目录 一、关系型数据库与非关系型数据库 1.1关系型数据库 1.2非关系型数据库 1.2.1非关系型数据库产生背景 1.3关系型非关系型区别 1.4客户访问时&#xff0c;关系型数据库与redis的工作过程 二、Redis 2.1redis简介 2.2Redis命中机制和淘汰机制 2.3Redis 具有以下优…

树莓派安装Windows搭建网盘和下载机

0 需求分析 在同一个局域网内&#xff0c;同时有多种设备&#xff08;Windows&#xff0c;Linux&#xff0c;Android&#xff09;需要进行大量的数据共享。另外&#xff0c;还时常需要从百度网盘/夸克网盘等网盘下载文件。不难看出&#xff0c;我的需求很简单&#xff0c;就是…

提醒:2024年思维100春季线上比赛今天报名截止,来看官方样题

【温馨提醒】今天是2024年4月6日&#xff0c;是2024年春季思维100活动第一阶段线上比赛报名的截止日期。如果要参赛&#xff0c;请设置好闹钟别错过了报名。更多安排和需要提前了解的关键点可以见我前面写的文章&#xff0c;或者直接联系我获取相关资料。 官方发布的2024年春季…

汽车网络安全管理

汽车网络安全管理 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c…

javaweb学习(day11-监听器Listener过滤器Filter)

一、监听器Listener 1 Listener介绍 Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是&#xff1a;Servlet 程 序、Listener 监听器、Filter 过滤器 Listener 是 JavaEE 的规范&#xff0c;就是接口 监听器的作用是&#xff0c;监听某种变化(一般就是对…

Java零基础入门-递归

一、概述 上一期&#xff0c;我们是具体学习了File类的一些概念基础知识点&#xff0c;以及对于该类的常用方法进行了一个全量举例演示&#xff0c;这也是考虑到有的小伙伴在阅读的同时&#xff0c;没有时间去实际测试&#xff0c;所以我也就顺带的给大家去做了实例演示&#x…