08-什么是类加载器,类加载器有哪些, 双亲委派模型机制?

news2024/11/26 4:41:40

1.类加载器

1.实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。

2.虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类。

3.类加载器虽然只用于实现类的加载动作,但是对于任意一个类,都需要由加载它的类加载器和这个类本身共同确立其在Java虚拟机中的唯一性。通俗的说,JVM中两个类是否“相等”,首先就必须是同一个类加载器加载的,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要类加载器不同,那么这两个类必定是不相等的。

这里的“相等”,包括代表类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法的返回结果,也包括使用instanceof关键字做对象所属关系判定等情况。

1.启动类加载器(Bootstrap ClassLoader)

负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath 参数指定路径中的,且被虚拟机认可(按文件名识别,如 rt.jar)的类。

用来加载 java 核心类库,无法被 java 程序直接引用。

2.扩展类加载器(Extension ClassLoader)

负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类库。

用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。

3.应用程序类加载器(Application ClassLoader)

又叫系统类加载器(system class loader), 负责加载用户路径(classpath)上的类库。
JVM 通过双亲委派模型进行类的加载,当然我们也可以通过继承 java.lang.ClassLoader实现自定义的类加载器。

4.用户自定义类加载器

通过继承 java.lang.ClassLoader 类的方式实现

在这里插入图片描述

2.双亲委派模型

当一个类收到了类加载请求,它首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。

采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object 对象。
在这里插入图片描述

//ClassLoader类的loadClass源码
protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

1.双亲委托机制的作用

1.共享功能
可以避免类的重复加载,当父类加载器已经加载了该类时,就没有必要子ClassLoader再加载一次。一些Framework层级的类一旦被顶层的ClassLoader加载过就缓存在内存里面,以后任何地方用到都不需要重新加载。

2.隔离功能
考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Object的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Object,而直接返回已加载过的Object.class,这样便可以防止核心API库被随意篡改。

2.如何打破双亲委派模型

双亲委派模型的逻辑都在loadClass()中,重写loaderClass()方法

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

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

相关文章

ES索引规划方案

ES索引规划方案 1.引言 《ES索引规划方案》是研发部门针对审计系统需求&#xff0c;对海量日志数据进行实时存储和查询的解决方案&#xff0c;经过不断完善整理成册&#xff0c;以供后续相关开发人员学习使用 1.1.术语 序号用语说明1时序索引以时间为轴&#xff0c;数据只有…

Blender里的三种绑定 (二)约束

文章目录Blender里的三种绑定.约束.变换约束.复制位置.复制旋转.复制缩放.限定距离.限定位置&#xff0c;限定旋转&#xff0c;限定缩放.维持体积.变换.追踪约束.钳制到.阻尼追踪.锁定追踪.拉伸到.标准跟随.关系约束.动作.骨架.子级.基面.跟随路径.轴心.缩裹.Blender里的三种绑…

ViT(Version Transformer)原始论文解读

An Image is Worth 16x16 Words Transformers for Image Recognition at Scale paper&#xff1a;2010.11929.pdf (arxiv.org) code&#xff1a;google-research/vision_transformer (github.com) 期刊/会议&#xff1a;ICLR 2020 摘要 虽然Transformer体系结构已经成为自然…

【保姆级】@PostConstruct @PreDestroy使用示例

简介PostConstruct & PreDestroy被PostConstruct注解修饰的方法会在服务器加载Servlet的时候运行&#xff0c;并且只会被服务器调用一次&#xff0c;类似于Servlet的init()方法&#xff0c;被PostConstruct注解修饰的方法会在构造函数之后&#xff0c;init()方法执行之前执…

群晖NAS搭建portainer

参考&#xff1a; 群晖、威联通、Linux最强docker管理工具portainer安装及汉化教程2022最新版本 Portainer官方文档 How to run Docker commands without sudo on a Synology NAS 因为群晖的NAS是基于linux但是限制很多的系统&#xff0c;有一些东西通过命令行操作可能会遇到权…

Git 常见错误 之 fatal: Authentication failed 简单解决方法

Git 常见错误 之 fatal: Authentication failed 简单解决方法 目录 Git 常见错误 之 fatal: Authentication failed 简单解决方法 一、简单介绍 二、问题现象 三、解决方法 1、修改全局配置用户名 和 邮箱 2、修改凭证(具体问题具体分析) 一、简单介绍 Git(读音为/gɪt…

系分 - 案例分析 - 需求分析

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录系分 - 案例分析 - 需求分析结构化分析SA数据流图DFD答题技巧典型例题题目描述参考答案面向对象的分析OOA用例图用例模型细化用例描述用例关系【包含、扩展、泛化】分析模型定义概念类确定类之间的关系类图…

拉伯证券|LPR利率三连降 全国首套房贷利率今年或“奔三”

2022年LPR接连下调。新年伊始&#xff0c;“房贷一族”迎来好消息&#xff0c;一年一度存量房贷利率重定价的日子到了。关于房贷利率挂钩借款商场报价利率(LPR)、重定价日为每年1月1日的住宅顾客&#xff0c;本年的房贷利率将迎来下降。不仅如此&#xff0c;存量公积金借款也于…

Flink实时计算引擎入门教程

Flink实时计算引擎入门教程 1.简介 Fink是一个开源的分布式,高性能,高可用,准确的实时数据计算框架&#xff0c;它主要优点如下: 流式计算: Fink可以连接处理流式(实时)数据。 容错: Fink提供了有状态的计算,会记录任务的中间状态,当执行失败时可以实现故障恢复。 可伸缩: F…

【软件测试】关于BUG的那些点点滴滴

关于BUG1. 如何合理的创建Bug1.1 创建Bug的要素2. Bug 的级别3. Bug 的生命周期3.1 Bug的状态3.2 Bug的生命周期4. 提出Bug后&#xff0c;跟开发产生争执怎么办1. 如何合理的创建Bug 1.1 创建Bug的要素 问题的版本&#xff0c;如浏览器的版本问题的环境&#xff0c;如windows…

融合注意力模块CBAM基于轻量级yolov5n开发共享单车目标检测系统

在很多的项目实战中验证分析注意力机制的加入对于模型最终性能的提升发挥着积极正向的作用&#xff0c;在我之前的一些文章里面也做过了一些尝试&#xff0c;这里主要是想基于轻量级的n系列模型来开发构建共享单车检测系统&#xff0c;在模型中加入CBAM模块&#xff0c;以期在轻…

web自动化测试---使用java+selenium+Junit

目录 1.什么是自动化以及为什么要进行自动化 2.为什么选择selenium作为web自动化工具 3.selenium环境部署 4.什么是驱动以及驱动的原理 5.selenium的基础语法和操作 5.1定位元素 5.2元素的操作 5.3等待 5.4信息打印 5.5窗口 5.6导航 5.7弹窗 5.8鼠标、键盘操作 5.…

Python + Appium 自动化操作微信入门

Appium 是一个开源的自动化测试工具&#xff0c;支持 Android、iOS 平台上的原生应用&#xff0c;支持 Java、Python、PHP 等多种语言。 Appium 封装了 Selenium&#xff0c;能够为用户提供所有常见的 JSON 格式的 Selenium 命令以及额外的移动设备相关的控制命令&#xff0c;…

虚拟化技术

虚拟化 虚拟化技术 目前虚拟化技术有软件模拟、全虚拟化&#xff08;使用二进制翻译&#xff09;、半虚拟化&#xff08;操作系统辅助&#xff09;、硬件辅助虚拟化和容器虚拟化这几种。 &#xff08;1&#xff09;软件虚拟化 软件模拟是通过软件完全模拟cpu、芯片组、磁盘、…

Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947)

参考链接&#xff1a;https://blog.csdn.net/xiaobai_20190815/article/details/124045768 http://news.558idc.com/290335.html Java 安全-手把手教你SPEL表达式注入_4ct10n的博客-CSDN博客_spel注入 一、漏洞描述 Spring Cloud Gateway 是基于 Spring Framework 和 Spring…

组学新品|“4K”微生态之肠道菌群深度宏基因组

1.“4K”微生态定义 人体微生物群是人体内部与体表所有微生物有机体的总称[1]&#xff0c;其组成包括非细胞结构的病毒&#xff08;包括噬菌体&#xff09;、原核生物中的真细菌和古细菌&#xff0c;以及真核细胞微生物。与之对应&#xff0c;微生物群可以分为病毒群、细菌群、…

Redis未授权访问漏洞(二)Webshell提权篇

前言 在学习这篇文章之前&#xff0c;请先通过这篇文章Redis未授权访问漏洞(一)先导篇学习一下基础知识&#xff0c;再来学习这篇文章。 webshell提权 环境准备 攻击机&#xff1a; Centos7 IP:192.168.44.130 靶机&#xff1a;Centos7 IP:192.168.44.129 首先我们需要准备好…

QuartzNet的基本使用,Scheduler,Job,Trigger的应用

Quartz.Net的基本使用方法 Quartz.Net的基本使用是比较简单的&#xff0c;主要是对下面三个工具的创建和使用。 Scheduler调度器Job执行的动作Trigger触发器 Scheduler的创建和使用 scheduler的创建有几种不同的方式,但一般可以直接使用其提供的工厂类直接创建 通过工厂类…

分享92个NET源码,总有一款适合您

NET源码 分享92个NET源码&#xff0c;总有一款适合您 92个NET源码下载链接&#xff1a;https://pan.baidu.com/s/1Ya4GMXuHhNbqkLU5b7SPEw?pwd5vpx 提取码&#xff1a;5vpx 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&…

【指针面试题】-还在为学过指针的理论只是不会实践吗??赶紧来看看这里讲解了许多指针的面试题,带你更好掌握指针!!!

&#x1f387;作者&#xff1a;小树苗渴望变成参天大树 &#x1f9e8;作者宣言&#xff1a;认真写好每一篇博客 &#x1f38a;作者gitee:link &#x1f389;指针笔试题详解&#x1f4a5;前言&#x1f4a6;一、指针和数组面试题解析&#x1f4a8;1.1一维数组&#x1f4a2;1.2字…