JVM 基础 - Java 类加载机制

news2025/4/7 18:54:41

Java 类加载机制

  • 类加载器的分类
  • 类加载机制

类加载器的分类

在这里插入图片描述
如果有必要,我们还可以加入自定义的类加载器。因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,因此如果编写了自己的ClassLoader,便可以做到如下几点:
1、在执行非置信代码之前,自动验证数字签名。
2、动态地创建符合用户特定需要的定制化构建类。
3、从特定的场所取得java class,例如数据库中和网络中。

ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println(loader);  //Application ClassLoader
System.out.println(loader.getParent()); //Extension ClassLoader
System.out.println(loader.getParent().getParent());  //Bootstrap ClassLoader(无法被Java程序直接引用)

在这里插入图片描述
在这里插入图片描述
注意:这里父类加载器并不是通过继承关系来实现的,而是采用组合实现的。

类加载机制

1、全盘负责:当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。

2、父类委托:先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。

3、缓存机制:缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。这就是为什么修改了Class后,必须重启JVM,程序的修改才会生效。

4、双亲委派机制:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。

双亲委派模型对于保证Java程序的稳定运作极为重要,但它的实现却异常简单,用以实现双亲委派的代码只有短短十余行,全部集中在java.lang.ClassLoader的loadClass()方法之中。

加载我们自定义的一个用户类:User
在这里插入图片描述
通常情况下,我们都是直接使用系统类加载器。但是,有的时候,我们也需要自定义类加载器。比如应用是通过网络来传输 Java 类的字节码,为保证安全性,这些字节码经过了加密处理,这时系统类加载器就无法对其进行加载,这样则需要自定义类加载器来实现。自定义类加载器一般都是继承自 ClassLoader 类,我们只需要重写 findClass 方法即可。

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

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

相关文章

django-rest-framework框架总结之View视图之APIView、GenericAPIView、视图集ViewSet

APIView APIView 是 REST framework 提供的所有视图的基类,继承自Django的View父类。支持认证、限流、授权等功能。 rest_framework.views.APIViewAPIView 与 View 的不同之处在于: 传入到视图方法中的是 REST framework 的 Request 对象,…

Linux gcc和gdb的使用

gcc/g编译器的使用 gcc如何使用 语法: gcc [选项] 编译文件 功能: 用于编译C语言程序,编译C程序使用g。 选项: 指令说明-E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面-S编译到汇编语言不进行汇编和链接…

python设计模式-单例模式,工厂模式

单例模式 单例模式将类的实例化限制为一个对象。 它是一种创建模式,只涉及创建方法和指定对象的一个类。 它提供了创建实例的全局访问点。 如何实现一个单例类? 下面的程序演示了单例类的实现,并多次打印创建的实例。 class Singleton:_…

动态规划(详细解释)

日升时奋斗,日落时自省 目录 1、Fibonacci 2、字符串分割 3、三角矩阵 4、路径总数 5、最小路径和 6、背包问题 7、回文串分割 8、编辑距离 9、不同子序列 10、总结 DP定义: 动态规划是分治思想的延伸,通俗一点来说就是大事化小&a…

高密度 ARM 服务器如何引领“数智时代”发展,打通“智变质变”正循环

并行计算 | 多样性计算 | ARM架构 深度学习 | 高性能计算 | ARM服务器 如今随着算力、高性能计算的快速发展,数字经济已经成为全球经济增长的主引擎。数字经济的快速发展,使得深度学习、数据分析、数据挖掘等技术迅猛发展起来。伴随国家政策东数西算的…

无痕埋点在Android中的实现

无痕埋点在Android中的实现 目标 解决手动打点效率低下问题自动化埋点 本篇技术实现主要是运行是代理,不涉及到插桩技术,不引入插件,对业务影响点最小 技术难点 1. 如何拦截到所有的view的点击事件 view有个setAccessibilityDelegate方…

Day02-带你走进数据分析的世界

文章目录Day02-带你走进数据分析的世界数据分析正在影响我们的工作、生活数据分析和你想象中的一样吗我们应该具备的数据分析能力Day02-带你走进数据分析的世界 数据分析正在影响我们的工作、生活 随着全球经济数字化转型的发展,各行各业都积累了大量的数据。 具有…

微信小程序做全局登录弹窗

需求:在任意需要弹出登录的页面,后台返回需要登录状态码,弹出登录弹窗进行登录,并刷新当前页面 过程:因为微信小程序无法封装一个全局组件通过方法全局调用。因此只能封装一个公共组件,在需要弹窗的页面注册…

Spark入门指南

文章目录什么是SparkSpark学习路线Spark入门指南什么是Spark Apache Spark 是一个开源集群运算框架,最初是由加州大学伯克利分校 AMP 实验室所开发。相对于 Hadoop 的 MapReduce 会在运行完工作后将中间数据存放到磁盘中,Spark 使用了存储器内存运算技术…

SpringMVC之请求与响应

目录 一&#xff1a;设置请求映射路径 1. 环境准备 二&#xff1a;问题分析 三&#xff1a;设置映射路径 四&#xff1a;请求参数 一&#xff1a;设置请求映射路径 1. 环境准备 创建一个Web的Maven项目 pom.xml添加Spring依赖 <?xml version"1.0" encodi…

基于Android的电子影院系统

需求信息&#xff1a; 客户端&#xff1a; 1&#xff1a;用户注册登录&#xff1a;通过手机号码、用户名称以及密码完成用户的注册和登录 2&#xff1a;影院信息&#xff1a;用户可以查看发布的影院信息以及查看影院具体反映的电影信息以及可以查看电影的宣传片&#xff1b; 3&…

Linux - Linux命令大全

阅读前可参考 https://blog.csdn.net/MinggeQingchun/article/details/128547426 一、Linux系统管理 &#xff08;一&#xff09;查看Linux系统版本 1、查看Linux内核版本 1、cat /proc/version&#xff1a;Linux查看当前操作系统版本信息 2、uname -a&#xff1a;Linux查看…

STM32--SPI、I2C、CAND等常用通信外设总线概括

1. SPI SPI是串行外设接口&#xff08; Serial Peripheral Interface&#xff09;的缩写。 SPI&#xff0c;是一种高速的&#xff08;之前做学传输比特115200 112k, 而SPI传输速度为10Mbps&#xff09;&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管…

Allegro如何改变线宽操作指导

Allegro如何改变线宽操作指导 用Allegro做pcb设计的时候,改变走线线宽是非常常用的功能,如下图 线宽目前是12mil,需要把线宽改成15mil 具体操作如下 选择Edit选择Change

摆脱银行询证函的烦恼,契约锁推出银行询证函数字化解决方案

近日&#xff0c;中国财政部会同银保监会印发“财会[2022]39号文件”&#xff0c;明确要加快推进银行函证数字化建设。鼓励具备条件的会计师事务所和银行通过银行函证平台&#xff08;包括第三方函证平台和银行自建函证平台&#xff09;开展数字化函证&#xff0c;有效提升函证…

Jenkins集群配置/并发构建

Jenkins集群配置/并发构建1、集群配置步骤1.1 Jenkins服务器规划1.2 添加节点1.2.1 添加Jenkins-02节点1.2.2 添加Jenkins-03节点1.3 Item配置1.4 执行构建任务测试是否成功集群化构建可以有效提升构建效率&#xff0c;尤其是团队项目比较多或是子项目比较多的时候&#xff0c;…

2023前端调试技巧

前端工作中&#xff0c;不仅编码很重要&#xff0c;重现bug&#xff0c;解决bug的能力同样重要。而这些都离不开代码调试。大厂面试题分享 面试题库前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库PC调试console.log()…

支付宝调用支付流程(沙箱环境)

文章目录实现效果&#xff1a;前提准备支付流程方案一1. 导入依赖2. 配置文件3. 支付宝初始化4. 唤起支付方案二1. 导入依赖2. 唤起支付实现效果&#xff1a; 前提准备 由于本文只是提及支付的流程及其一些相关知识点&#xff0c;所以前提数据自行准备&#xff0c;参考支付宝支…

Micropython ESP32

Micropython ESP32模块列表network模块WIFI STA模式WIFI AP模式machine模块CPU主频GPIO端口GPIO输入模式GPIO输出模式GPIO中断模式ADC模数转换DAC数模转换PWM脉冲宽度调制UART串口Timer定时器官方文档 下载固件 模块列表 network模块 help(network) object <module ‘net…

域名基础知识

1.域名的概念及作用 域名&#xff08;Domain Name&#xff09;&#xff0c;又称网域&#xff0c;是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&#xff09;。 由于IP地址…