JAVA基础学习【JVM篇】——类加载器

JVM—虚拟机类加载器 是一种软件设计模式,它通过将系统中的相关组件(类、函数、变量等)封装到一个独立的容器中,实现组件之间的逻辑隔离。这个容器可以被动态地配置和修改,实现不同的功能需求。 阅读详情

虚拟机设计团队把加载阶段中的“通过一个类的全额限定名来获取此类的二进制字节流”放到虚拟机外部去实现,以便让程序自己去决定如何获取所需要的类。实现这个动作的代码模块被称为“类加载器”

一般来说,Java 虚拟机使用 Java 类的方式如下:
1. JAVA源程序被编译器编译之后形成字二进制节码文件(class文件)
2. 类加载器负责读取该二进制字节码,并转化为java.lang.class的一个实例,这个实例也就是我们所说的class对象

类与类加载器

对于任意一个类,都需要由加载这个类的类加载器和这个类本身来确定这个类在虚拟机中的唯一性,每一个类加载器,都有一个类名称空间(在JAVA基础学习【JVM篇】——类加载机制中介绍数组类的加载时提到过)。通俗来说:比较两个类是否相等,首先得被同一个类加载器加载才有意义。否则,就算是来源于同一个文件,但是类加载器不同,产生的也是不同的类

双亲委派模型

分类

从JAVA虚拟机的角度讲,只存在两种不同的类加载器

  1. 启动类加载器,用C++实现,是虚拟机自身的一部分
  2. 其他的类加载器,使用JAVA语言实现,独立于虚拟机之外,并且全部继承自抽象类java.lang.ClassLoader

从JAVA开发人员的角度来看,还可以分得更加细致,分为以下三种:

  1. 启动类加载器:这个类加载器负责加载放在<JAVA_HOME>\lib目录中的,或者是被-Xbootclasspath参数所指定的路径中的,并且是虚拟机所识别的(按照文件名识别,如rt.jar,名字不符合类库,就算放在目录下,也不会被加载)。启动类加载器不能被JAVA程序直接引用,用户在编写自定义加载器时,如果需要把请求委托给引用类加载器,那么直接使用null替代即可。

    出于安全考虑,启动类加载器只加载包名为java、javax、sun等开头的类。

  2. 扩展类加载器:这个加载器负责加载<JAVA_HOME>/lib/ext目录中的,或者被java.ext.dirs系统变量指定的路径中的所有类库,开发者可直接使用该类加载器。

  3. 应用程序类加载器:这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也成为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可用直接使用这个类加载器,如果应用程序中没有自定义过类加载器,那么这个类加载器就是程序中默认的加载器。

双亲委派机制
上图中展示的这种类加载器之间的层次关系,称为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类记载器外,所有的加载器都有自己的父加载器。这里的类加载器的关系不是继承,而是以组合的关系来复用父加载器的代码

工作过程

如果一个类加载器收到了类加载的请求,它首先不会自己尝试加载这个类,而是把这个请求委托给自己的父加载器,每一层次都是如此,因此所有的加载请求都会被传递到启动类加载器中,只有当父加载器反馈自己无法加载此类时,子加载器才会尝试自己加载此类

双亲委派模型的好处

采用双亲委派模型的好处是JAVA随着类加载器有了一定的层次关系。

  • 例如java.lang.Object,他存放在rt.jar中,无论哪一个类加载器记载这个类,最终都是委托启动类加载器加载,因此Object类在程序的各种类加载环境中都是同一个类。 通过这种层次关系可以避免类的重复加载,如果父加载器加载过一遍,那么子加载器就不需要再进行加载。
  • 其次是考虑到安全因素,加入从网络中传来一个java.lang.Integer的类,通过双亲委派机制交给启动类加载器加载,但是启动类加载器之前已经加载过该类了,会直接返回已经加载过的Integer.class,这样做可以防止核心API被篡改。
  • 可能你会想,如果我们在classpath路径下自定义一个名为java.lang.SingleInterge类(该类是胡编的)呢?该类并不存在java.lang中,经过双亲委托模式,传递到启动类加载器中,由于父类加载器路径下并没有该类,所以不会加载,将反向委托给子类加载器加载,最终会通过系统类加载器加载该类。但是这样做是不允许,因为java.lang是核心API包,需要访问权限,强制加载将会报出如下异常ClassNotFoundException

双亲委派模型的实现

首先检查类是否被加载过,若没有加载则调用父加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器(只有启动类加载器没有父加载器)。如果父类加载失败,抛出ClassNotFoundException异常后,再调用自己的findClass()方法进行加载。

protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{
    //check the class has been loaded or not
    Class c = findLoadedClass(name);
    if(c == null) {
        try{
            if(parent != null) {
                c = parent.loadClass(name, false);
            } else{
                c = findBootstrapClassOrNull(name);
            }
        } catch(ClassNotFoundException e) {
            //if throws the exception , the father can not complete the load
        }
        if(c == null) {
            c = findClass(name);
        }
    }
    if(resolve) {
        resolveClass(c);
    }
    return c;
}
MySQL常见面试题汇总(建议收藏!!!) 目录一、索引相关(1)什么是索引?(2)索引是个什么样的数据结构呢?(3)为什么使用索引?(4)Innodb为什么要用自增id作为主键?(5)Hash 索引和 B+ 树索引有什么区别或者说优劣呢?(6)什么是聚簇索引(6)非聚簇索引一定会回表查询吗?(6)聚簇索引和非聚簇索引的区别(6)MyISAM和InnoDB实现B+树索引方式的区别是什么?(6)MySQL中有四种索引类型,可以简单说说吗?(6)覆盖索引是什么?(6)联合索引是什么?为什么需要注意联合索引中的顺序?(6)创建的索引有没有被使用到?或者说怎 阅读详情

相关推荐

STM32F4三重ADC+DMA双缓冲实战:用CubeMX搞定同步采样,告别数据覆盖烦恼

本文详细介绍了STM32F4三重ADC与DMA双缓冲技术的实战应用,通过CubeMX配置实现同步采样,解决数据覆盖问题。内容涵盖硬件架构解析、CubeMX工程配置、双缓冲实现技巧及调试优化方法,适用于电机控制、电力监测等需要高精度多通道信号采集的场景。

weixin_30627341的博客 357

基于《狂神说java》JVM 入门--学习笔记

本笔记仅做学习与复习使用,不存在刻意抄袭。给各位学友强烈推荐《遇见狂神说》他的整套Java学习路线使我获益匪浅!!!点击跳转至遇见狂神说哔哩哔哩首页如果你也是狂神的小迷弟,可以加我好友一起探讨学习。 ...

wudidahuanggua的博客 528

物理与工程中的‘黑话’:Kronecker delta和Levi-Civita符号到底简化了什么?

本文深入解析了物理与工程中常用的Kronecker delta和Levi-Civita符号的简化作用。通过对比传统表示与张量表示,展示了这些符号在向量运算、矩阵迹计算及流体力学模拟中的高效应用,显著提升计算效率和代码可读性。特别适合理论物理和工程数学领域的学习者与从业者。

weixin_27215403的博客 399

关于Linux和Java基础知识的部分总结

学习总结(一) Linux常用操作命令与一些基本概念 Linux命令 cd 目录切换 ls 文件显示 sudo 使普通用户暂时拥有root权限 cat 查看文件内容 more 查看文件内容 cp 复制 mv 移动 touch 创建文件 rm -rf 删除文件 mkdir 创建文件夹 deldir??删除文件(不知道,也无需记忆,一切文件都可以用rm来删除) adduser 添加用户 deluser 删除用户 passwd 修改密码 chmod 修改权限 chgrp 修改文件所属组 chown

晴天的博客 115

零基础教程:用Python给试卷照片自动切题(有道OCR+PIL完整流程)

本文为零基础用户提供了一套完整的Python自动化切题方案。通过调用有道OCR API识别试卷照片中的题目坐标,并利用PIL库进行精准裁剪,将杂乱的试卷图片自动分割为独立的题目图像。教程详细涵盖了环境搭建、图像预处理、API调用、坐标解析与批量处理全流程,帮助教育工作者和技术爱好者高效处理大量试卷,实现工作流程自动化。

grpc6streamer的博客 1174

SAP SM30数据维护实战:条件筛选与动态校验的实现技巧

本文详细介绍了SAP SM30数据维护的实战技巧,重点讲解如何通过条件筛选实现精准数据查取,以及利用表维护生成器事件实现动态数据检查与校验。文章提供了从基础视图创建到高级事件编程的完整流程,包括调用函数VIEW_MAINTENANCE_CALL传递筛选条件,以及在NEW_DATA和CHANGE_SAVE事件中编写业务规则校验逻辑,帮助开发者提升SM30的管控能力与数据质量。

q9w8e7r6t5的博客 521

深入OpenJDK源码全面理解Java类加载器(上 -- JVM源码篇)

目录前言一、从JDK源码看双亲委派二、使用步骤1.引入库2.读入数据总结 前言 关于JVM类加载的基础理论知识,请参照《深入理解Java虚拟机》读书笔记(六)–虚拟机类加载机制(上)和《深入理解Java虚拟机》读书笔记(六)–虚拟机类加载机制(下)。 一、从JDK源码看双亲委派 注:博主是使用的是openjdk8,换了新电脑还没有去编译源码,所以看的是静态代码,关于如何编译和调试源码,网上不少文章都有介绍,这里就不赘述了 我们都知道在Java类加载中,除了BootStrap加载器,App和Ext加载

黄智霖的博客 1万+

告别密码本!用Windows NPS给华为/华三交换机做Radius认证,SSH登录更安全

本文详细介绍了如何利用Windows NPS实现华为/华三交换机的Radius认证,提升SSH登录安全性。通过集中化管理、精细化控制和完整审计追踪,企业可告别传统密码本,大幅提升网络设备管理效率。文章包含NPS服务部署指南、交换机配置详解及调试技巧,助力企业构建安全高效的统一认证体系。

weixin_42549723的博客 419

【Java 基础篇】Java类加载器详解

Java允许开发人员自定义类加载器,以满足特定的加载需求。自定义类加载器必须继承类,并重写findClass方法。在findClass方法中,开发人员可以根据自己的规则和逻辑来加载类的字节码。// 根据名称加载类的字节码 byte [ ] byteCode = loadClassByteCode(name);// 调用defineClass方法将字节码转换为Class对象 return defineClass(name , byteCode , 0 , byteCode . length);

繁依Fanyi的博客 1万+

破解现代反爬虫:JS加密、OB混淆与CSS反爬的实战攻防分析

摘要: 随着反爬技术的升级,JS加密、OB混淆和CSS反爬成为主流防护手段,阻碍传统爬虫获取数据。本文解析了这些技术的工作原理,并提出破解策略:通过模拟浏览器(如Selenium、Puppeteer)执行动态JS,逆向混淆代码,以及利用开发者工具突破CSS隐藏。针对复杂防护,开发者需结合技术分析与工具应用,如API接口抓取、动态渲染破解等,以应对不断演进的反爬机制。未来,爬虫攻防将持续升级,需保持技术敏锐性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1648

光通量与辐射通量之间的换算

由理论和实验可知存在两种定义: 1W1W1W(瓦特)的频率为540×1012Hz540\times10^{12}Hz540×1012Hz(赫兹)的单色辐射的辐射通量等于683lm(流明)683lm(流明)683lm(流明).。 1lm1lm1lm的频率为540×1012Hz540\times10^{12}Hz540×1012Hz的单色通量等于1683=0.001464W\frac{1}{683}=0.001464W6831​=0.001464W。 从上述定义中我们可以得到什么呢?我们知道光速: c=3×

u011699626的博客 3273

彻底搞懂JVM类加载器:基本概念

本文阅读时间大约9分钟。写在前面在Java面试中,在考察完项目经验、基础技术后,我会根据候选人的特点进行知识深度的考察,如果候选人简历上有写JVM(Java虚拟机)相关的...

阿杜的世界 6723

Unity Hololens2开发|(三)工程发布及真机部署(3种方法)

选择项目->属性,进入项目属性页,选择调试,将HoloLens2的IP地址填写至页面,如下图。确保HoloLens2与计算机在同一网络下,并保持开启状态,点击运行,即开始生成部署.注意:该方式不支持覆盖安装,如果重复安装同一个App,需要先卸载再安装!选择Release下的ARM64,选择远程计算机,如下图。

游戏开发小Y的博客 14万+

Java——jvm篇

汇总了java面试中常见的jvm相关问题

Michael_Jay的博客 3044

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

黑马基础篇JVM学习总结(上)

一次编写,处处运行。即它不用针对不同平台分别编译(因为我们平时写的程序计算机是看不懂的,得先翻译成它能接受的机器指令,而不同平台的指令集是有差异的),具体是怎么实现的呢?JAVA会先经编译器编译为字节码文件(.class),后再由JVM翻译成机器指令以执行,这样只需要在安装有JVM的平台上就可运行(而且JVM还可以自动进行垃圾回收等机制)。大幅降低了跨平台开发的复杂度。完整定义如下:JVM(Java Virtual Machine,Java 虚拟机) 是一种能够运行Java 字节码的虚拟计算机程序。

2303_78315474的博客 2206

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【JVM基础篇】类加载器分类介绍

介绍JVM中不同类型的类加载器

我只管埋头前行,剩下的交给时间。 1870

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java 入门指南:JVM(Java虚拟机)—— Java 类加载器详解

类加载器(Class Loader)是 Java 虚拟机(JVM)的一部分,它的作用是将类的字节码文件(.class 文件)从磁盘或其他来源加载到 JVM 中。类加载器负责查找和加载类的字节码文件,并将其转化为 Class 对象。

热带鱼的技术博客 2456

JVM基础【Java】

Java中JVM的基础知识

amazing2024的博客 2163

黑马Java面试笔记之 JVM虚拟机篇(JVM+类加载器)

程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。javap -verbose xx.class 打印堆栈大小,局部变量的数量和方法的参数idea图形化java虚拟机对于多线程是通过线程轮流切换并且分配线程执行时间。在任何的一个时间点上,一个处理器只会处理执行一个线程,如果当前被执行的这个线程它所分配的执行时间用完了【挂起】。处理器会切换到另外的一个线程上来进行执行。并且这个线程的执行时间用完了,接着处理器就会又来执行被挂起的这个线程。

2201_75550069的博客 1348

JVM-基础篇-10-类加载器的分类

引导类加载器:负责加载 Java 核心类库。扩展类加载器:负责加载 JDK 扩展目录下的类。系统类加载器:负责加载应用程序类路径下的类。自定义类加载器:由用户自定义,用于加载特定需求的类。通过这些类加载器,Java 实现了灵活的类加载机制,同时也确保了类加载的安全性与效率。模块化和分层设计:确保每个层次只负责加载特定类型的类。父委托机制:保证加载过程的安全性,防止核心类库被恶意替换。灵活性和隔离性:支持动态加载和模块隔离,适应复杂应用场景。性能优化:提高类加载效率,避免不必要的全局加载。

qq_41577703的博客 865

JVM基础:深入理解类加载器

类加载器是JVM中一个非常重要的组件,它负责将.class文件加载到JVM中,并为其创建java.lang.Class对象。通过了解类加载器的层次结构、加载机制以及类加载过程,我们可以更好地理解和使用Java平台,避免在开发中遇到类加载相关的问题。同时,自定义类加载器也为Java平台提供了更多的灵活性和扩展性。

m0_63550220的博客 2320

JVM类加载器

文章目录一、类加载器二、类与类加载器三、双亲委派模型四、破坏双亲委派模型4.1、Tomcat4.1.1、WebApp类加载器4.1.2、Shared类加载器4.1.3、Catalina类加载器4.1.4、Common类加载器4.1.5、Jsp类加载器4.2、JDBC 一、类加载器 从Java虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语

rockvine的博客 3486

JVM的认识及理解,java执行过程以及类加载器

它可以理解为一个虚拟的计算机,屏蔽了不同操作系统之间的差异,使得Java程序可以在任何安装了JVM的平台上运行,实现了“一次编写,到处运行”的理念。JRE (Java Runtime Environment): 是运行已编译的Java程序所需的环境,包含了JVM(Java虚拟机)以及Java类库。JVM内置的类加载器,有Bootstrap(引导类)加载器、ExtClassLoader(拓展类)加载器和(系统类)AppClassLoader加载器 三种,分别负责加载不同目录下的.class文件。

2302_80365710的博客 1620

JVM学习笔记(1)-JVM总体篇

目录 0 前言 1 Java体系描述 1.1 Java体系构成 1.2 Java平台描述 2 JVM体系描述 2.1 JVM基本概念 2.2 ​​​​​​​JVM运行原理 3 示例 参考 0 前言      最近买了周志明的《深入理解Java虚拟机 JVM高级特性与最佳实践 》,结合网上的相关文章资料,尝试做一套JVM学习笔记,也算整理和巩固。相关引用文章,已罗列在参考篇中,...

wingsing2010的专栏 4700

深入理解JVM中的ClassLoader类加载器

文章目录深入理解JVM中的ClassLoader类加载器JVM的体系结构图JVM的位置JVM结构图中的class files文件JVM结构图中的类加载器ClassLoader的解释类加载器ClassLoader的作用类加载器的种类java类的加载机制双亲委派机制沙箱安全机制 深入理解JVM中的ClassLoader类加载器 JVM的体系结构图 先来看一下JVM的体系结构,如下图: JVM的位置 JVM的位置,如下图: JVM是运行在操作系统之上的,与硬件没有直接的交互,但是可以调用底层的硬件,用JIN(

xzy的博客 3150

JVM 基础篇:类加载器

JVM 基础篇:类加载器

qq_62767608的博客 985
上一篇: JAVA基础学习【JVM篇】——类加载机制
下一篇: JAVA基础学习【JVM篇】——垃圾回收机制
近光
博客等级 码龄10年 28粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值