类加载机制——双亲委派机制

类加载器分类

类加载器

类加载器(英文:ClassLoader)负责加载 .class 字节码文件,.class 字节码文件在文件开头有特定的文件标识。ClassLoader 只负责 .class 字节码文件的加载,至于它是否可以运行,则由 Execution Engine 决定。

images

JVM 中类加载器分为四种:前三种为虚拟机自带的加载器。

  • 启动类加载器(Bootstrap):使用 C++ 语言编写的类加载器,在Java环境下看不到

    负责加载 JAVA_HOME/lib/.jar 里所有的 class。由 C++ 实现,不是 ClassLoader 子类

  • 扩展类加载器(Extension):sun.misc.Launcher.ExtClassLoader

    负责加载 Java 平台中扩展功能的一些 jar 包,包括 JAVA_HOME/lib/.jar 或 -Djava.ext.dirs 参数指定目录下的 jar 包、以及 JAVA_HOME/lib/ext/classes 目录下的 class。

  • 应用类加载器(AppClassLoader):sun.misc.Launcher.AppClassLoader

    也叫系统类加载器,负责加载classpath中指定的 jar 包及目录中的 class

  • 自定义类加载器:程序员自己开发一个类继承 java.lang.ClassLoader,定制类加载方式

父子关系1:启动类加载器是扩展类加载器的父加载器

父子关系2:扩展类加载器是应用类加载器的父加载器

代码测试

// 1.获取Person类的Class对象
// 2.通过Class对象进一步获取它的类加载器对象
ClassLoader appClassLoader = Person.class.getClassLoader();// 3.获取appClassLoader的全类名
String appClassLoaderName = appClassLoader.getClass().getName();// 4.打印appClassLoader的全类名
// sun.misc.Launcher$AppClassLoader
System.out.println("appClassLoaderName = " + appClassLoaderName);// 5.通过appClassLoader获取扩展类加载器(父加载器)
ClassLoader extClassLoader = appClassLoader.getParent();// 6.获取extClassLoader的全类名
String extClassLoaderName = extClassLoader.getClass().getName();// 7.打印extClassLoader的全类名
// sun.misc.Launcher$ExtClassLoader
System.out.println("extClassLoaderName = " + extClassLoaderName);// 8.通过extClassLoader获取启动类加载器(父加载器)
ClassLoader bootClassLoader = extClassLoader.getParent();// 9.由于启动类加载器是C语言开发的,在Java代码中无法实例化对象,所以只能返回null值
System.out.println("bootClassLoader = " + bootClassLoader);

双亲委派机制

images

  • 当我们需要加载任何一个范围内的类时,首先找到这个范围对应的类加载器
  • 但是当前这个类加载器不是马上开始查找
  • 当前类加载器会将任务交给上一级类加载器
  • 上一级类加载器继续上交任务,一直到最顶级的启动类加载器
  • 启动类加载器开始在自己负责的范围内查找
  • 如果能找到,则直接开始加载
  • 如果找不到,则交给下一级的类加载器继续查找
  • 一直到应用程序类加载器
  • 如果应用程序类加载器同样找不到要加载的类,那么会抛出ClassNotFoundException异常

 

验证双亲委派机制

实验1

  • 第一步:在与JDK无关的目录下创建Hello.java
public class Hello {public static void main(String[] args){System.out.println("Hello  world");}}
  • 第二步:编译Hello.java
  • 第三步:将Hello.class文件移动到$JAVA_HOME/jre/classes目录下
  • 第四步:修改Hello.java
public class Hello {public static void main(String[] args){System.out.println("goodbye");}}
  • 第五步:编译Hello.java
  • 第六步:将Hello.class文件移动到$JAVA_HOME/jre/lib/ext/classes目录下
  • 第七步:修改Hello.java
public class Hello {public static void main(String[] args){System.out.println("Tom like jerry");}}
  • 第八步:编译Hello.java
  • 第九步:使用java命令运行Hello类,发现打印结果是:Hello  world
    • 说明Hello这个类是被启动类加载器找到的,找到以后就不查找其他位置了
  • 第十步:删除$JAVA_HOME/jre/classes目录
  • 第十一步:使用java命令运行Hello类,发现打印结果是:goodbye
    • 说明Hello这个类是被扩展类加载器找到的,找到以后就不查找其他位置了
  • 第十二步:删除$JAVA_HOME/jre/lib/ext/classes目录
  • 第十三步:使用java命令运行Hello类,发现打印结果是:Tom like jerry
    • 说明Hello这个类是被应用程序类加载器找到的

实验2

  • 第一步:创建假的String类
package java.lang;public class String {public String() {System.out.println("嘿嘿,其实我是假的!");}}
  • 第二步:编写测试程序类
    @Testpublic void testLoadString() {// 目标:测试不同范围内全类名相同的两个类JVM如何加装// 1.创建String对象java.lang.String testInstance = new java.lang.String();// 2.获取String对象的类加载器ClassLoader classLoader = testInstance.getClass().getClassLoader();System.out.println(classLoader);}
  • 第三步:查看运行结果是null
    • 假的String类并没有被创建对象,由于双亲委派机制,启动类加载器加载了真正的String类

双亲委派机制的好处

  1. 避免类的重复加载:父加载器加载了一个类,就不必让子加载器再去查找了。同时也保证了在整个 JVM 范围内全类名是类的唯一标识。
  2. 安全机制:避免恶意替换 JRE 定义的核心 API

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

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

相关文章

Vue-组件二次封装

本次对el-input进行简单封装进行演示 封装很简单,就给激活样式的边框(主要是功能) 本次封装主要使用到vue自带的几个对象 $attrs:获取绑定在组件上的所有属性$listeners: 获取绑定在组件上的所有函数方法$slots: 获取应用在组件内的所有插槽 …

成功解决Android设备adb连接后显示device unauthorized

一、提出问题 在电脑通过USB连接新的Android设备,想要通过adb来进行一些操作时,却发现命令提示符上在输入下面命令后显示设备未授权的信息也就是"unauthorized" adb devices二、不可行的解决方案 有人提出的解决方案是打开Android设备的开发…

2023年新手如何学剪辑视频 想学视频剪辑如何入门

随着短视频、vlog等媒体形式的兴起,视频剪辑已经成为了热门技能。甚至有人说,不会修图可以,但不能不会剪视频。实际上,随着各种智能软件的发展,视频剪辑已经变得越来越简单。接下来,一起来看看新手如何学剪…

【ChatGPT 指令大全】怎么使用ChatGPT来帮我们写作

在数字化时代,人工智能为我们的生活带来了无数便利和创新。在写作领域,ChatGPT作为一种智能助手,为我们提供了强大的帮助。不论是作文、文章,还是日常函电,ChatGPT都能成为我们的得力助手,快速提供准确的文…

MySQL — MVCC

文章目录 MVCCMVCC 实现原理隐藏字段undo logundo log的用途undo log类型 版本链ReadView MVCC InnoDB是一个多版本的存储引擎。它保留有关已更改行的旧版本的信息,以支持并发和回滚等事务性特性。这些信息存储在undo表空间中的数据结构称为回滚段。InnoDB使用回滚…

培训报名小程序报名功能完善

目录 1 修改数据源2 修改表单3 支付成功时修改状态4 创建报名成功页5 最终的效果总结 目前我们的报名功能已经搭建了一个基础版,后续需要展示用户已经报名的信息,需要添加一个状态来显示用户是否成功付费。 1 修改数据源 打开我们的报名数据源&#xff…

【基础类】—前端算法类

一、排序 1. 排序方法列表 2. 常见排序方法 快速排序选择排序希尔排序 二、堆栈、队列、链表 堆栈、队列、链表 三、递归 递归 四、波兰式和逆波兰式 理论源码

机器学习笔记之优化算法(十一)梯度下降法:凸函数VS强凸函数

机器学习笔记之优化算法——梯度下降法:凸函数VS强凸函数 引言凸函数:凸函数的定义与判定条件凸函数的一阶条件凸函数的梯度单调性凸函数的二阶条件 强凸函数强凸函数的定义强凸函数的判定条件强凸函数的一阶条件强凸函数的梯度单调性强突函数的二阶条件…

前后端分离式项目架构流程复盘之宿舍管理系统

文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:【🎇前端】先创建Vue-cli项目(版本2.6.10,仅包含babel),请选择此项目并创建 【整理简化项目模板】【🎀创建路由】…

git clean 命令

git clean -n //显示要删除的文件,clean的演习,告诉哪些文件删除,只是一个提醒。 git clean -dn //显示要删除的文件和目录 git clean -f //删除未追踪的文件 git clean -dff //删除未追踪的目录 git clean -df //清除所有未跟踪文件&#xf…

Netty面试题1

计算机网络模型 OSI采用了分层的结构化技术,共分七层, 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。 Open System Interconnect 简称OSI,是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参…

互联网医院|线上医疗平台连接医者和患者的桥梁

近年来,随着互联网技术的飞速发展,互联网医院系统悄然崛起,引领着医疗行业的变革浪潮。这一系统以其出色的功能与服务,为广大患者带来了便捷、高效的医疗体验,将传统医疗模式推向了新的高度。 作为医疗界的新生力量&a…

FFmpeg常见命令行(三):FFmpeg转码

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:如何使…

七月学习总结

一晃暑期七月份已经结束了,八月份需要做的事情更多。 在成长的路上不断地迷茫,不断地前进。到底才能完成对自己地救赎。 目前想的就是以后走软件开发,往架构方向做,主语言Java或者go,408基础一定要扎实,计…

新型网络安全:从过程到明确结果

内容 过去的情况网络安全是理论性的,结果才是实际性的。这可能吗?我们现在的努力方向结论 本文讲述了为什么企业必须重新思考其网络安全方法:旧方法是否足够有效,是否可以完全适用?公司应采取哪些行动来实现内部信息…

【LeetCode】【数据结构】单链表OJ常见题型(二)

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言: 【LeetCode】面试题02.04. 分割链表 【Lee…

微信小程序申请步骤

微信公众平台链接:https://mp.weixin.qq.com/ 1、进到微信公众平台,点一下“点击注册”,挑选账号申请种类“小程序”,填好微信小程序用户信息,包含电子邮箱、登陆密码等。 2、微信公众平台会发送一封电子邮件&#xf…

Web3 solidity编写交易所合约 编写ETH和自定义代币存入逻辑 并带着大家手动测试

上文 Web3 叙述交易所授权置换概念 编写transferFrom与approve函数我们写完一个简单授权交易所的逻辑 但是并没有测试 其实也不是我不想 主要是 交易所也没实例化 现在也测试不了 我们先运行 ganache 启动一个虚拟的区块链环境 先发布 在终端执行 truffle migrate如果你跟着我…

# ⛳ Docker 安装、配置和详细使用教程-Win10专业版

目录 ⛳ Docker 安装、配置和详细使用教程-Win10专业版🚜 一、win10 系统配置🎨 二、Docker下载和安装🏭 三、Docker配置🎉 四、Docker入门使用 ⛳ Docker 安装、配置和详细使用教程-Win10专业版 🚜 一、win10 系统配…

ArcGIS Pro基础:【划分】工具实现等比例、等面积、等宽度划分图形操作

本次介绍【划分】工具的使用,如下所示,为该工具所处位置。使用该工具可以实现对某个图斑的等比例面积划分、相等面积划分和相等宽度划分。 【等比例面积】:其操作如下所示,其中: 1表示先选中待处理的图斑,2…