尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-02和03-类的加载器分类

【项目实训】【2-1】ClassLoader 概述 ClassLoader是Java中的一个类,可以加载类字节码文件并将其转化为Class对象。 默认情况下,系统有三个ClassLoader,分别是BootstrapClassLoader、ExtensionClassLoader和AppClassLoader。 BootstrapClassLoader 启动类加载器,用于加载rt.jar中的类,由c++实现。在Java中表现为null。 ExtensionClassLoader 扩展类加载器,用于加载jre/lib中的类。 AppClassLoader 阅读详情

引言

  • JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。
  • 从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,在程序中我们最常见的类加载器结构主要是如下情况:

在这里插入图片描述

只有引导类加载器(Bootstrap ClassLoader)是C/C++语言编写

  • 除了顶层的启动类加载器外,其余的类加载器都应当有自己的“父类”加戟器。
  • 不同类加载器看似是继承(Inheritance)关系,实际上是包含关系。在下层加载器中,包含着上层加载器的引用。

在这里插入图片描述
没有继承

在这里插入图片描述
共同继承一个父类加载器

引导类加载器

  • 启动类加载器(引导类加载器,Bootstrap ClassLoader)
  • 这个类加载使用C/C++语言实现的,嵌套在JVM内部。
  • 它用来加载Java的核心库(JAVAHOME/jre/lib/rt.jar或sun.boot.class.path路径下的内容)。用于提供JVM自身需要的类。
  • 并不继承自java.lang.ClassLoader,没有父加载器。
  • 出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类
  • 加载扩展类和应用程序类加载器,并指定为他们的父类加载器。
  • 启动类加载器使用C++编写的?Yes!
    • C/C++:指针函数&函数指针、C++支持多继承、更加高效
    • Java:由C++演变而来,(C++)–版,单继承

使用-XX:+TraceClassLoading参数得到。

在这里插入图片描述
在这里插入图片描述

扩展类加载器

  • 扩展类加载器(Extension ClassLoader)
  • Java语言编写,由sun.misc.Launcher$ExtClassLoader实现。
  • 继承于ClassLoader类
  • 父类加载器为启动类加载器
  • 从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext子目录下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载。
    在这里插入图片描述

代码举例

package T1;

import java.net.URL;

public class ClassLoaderTest {
    public static void main(String[] args) {

        System.out.println("**********后动类加载器 **************");
        //获取BootstrapcLassLoader能够加载的api的路径
        URL[] urLs = sun.misc.Launcher.getBootstrapClassPath().getURLs();
        for (URL element : urLs) {
            System.out.println(element.toExternalForm());
        }
        // file:/F:/java/jdk/jre/lib/resources.jar
        //file:/F:/java/jdk/jre/lib/rt.jar
        //file:/F:/java/jdk/jre/lib/sunrsasign.jar
        //file:/F:/java/jdk/jre/lib/jsse.jar
        //file:/F:/java/jdk/jre/lib/jce.jar
        //file:/F:/java/jdk/jre/lib/charsets.jar
        //file:/F:/java/jdk/jre/lib/jfr.jar
        //file:/F:/java/jdk/jre/classes


        //从上面的路径中随森选择一个类,来看看他的类加我器是什么:引导类加载
        ClassLoader classloader = java.security.Provider.class.getClassLoader();
        System.out.println(classloader); // null


        System.out.println("***********扩展类加载器*************");
        String extDirs = System.getProperty("java.ext.dirs");
        for (String path : extDirs.split(";")) {
            System.out.println(path);
        }
        // F:\java\jdk\jre\lib\ext
        //C:\Windows\Sun\Java\lib\ext

        //从上面的路径中随意选择一个类,来看看他的类加载器是什么:扩展类加载器
        ClassLoader classLoader1 = sun.security.ec.CurveDB.class.getClassLoader();
        System.out.println(classLoader1);// sun.misc.Launcher$ExtClassLoader@12a3a380
    }
}

系统类加载器

  • 应用程序类加载器(系统类加载器,AppClassLoader)
  • java语言编写,由sun.misc.Launcher$AppClassLoader实现
  • 继承于ClassLoader类
  • 父类加载器为扩展类加载器
  • 它负责加载环境变量classpath或系统属性java.class.path 指定路径下的类库
  • 应用程序中的类加载器默认是系统类加载器。
  • 它是用户自定义类加载器的默认父加载器
  • 通过ClassLoader的getSystemClassLoader()方法可以获取到该类加载器
    在这里插入图片描述

用户自定义类加载器

  • 在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的。在必要时,我们还可以自定义类加载器,来定制类的加载方式。
  • 体现Java语言强大生命力和巨大魅力的关键因素之一便是,Java开发者可以自定义类加载器来实现类库的动态加载,加载源可以是本地的JAR包,也可以是网络上的远程资源。
  • 通过类加载器可以实现非常绝妙的插件机制,这方面的实际应用案例举不胜举。例如,著名的OSGI组件框架,再如Eclipse的插件机制。类加载器为应用程序提供了一种动态增加新功能的机制,这种机制无须重新打包发布应用程序就能实现。
  • 同时,自定义加载器能够实现应用隔离,例如Tomcat,Spring等中间件和组件框架都在内部实现了自定义的加载器,并通过自定义加载器隔离不同的组件模块。这种机制比C/C++程序要好太多,想不修改C/C++程序就能为其新增功能,几乎是不可能的,仅仅一个兼容性便能阻挡住所有美好的设想。
  • 自定义类加载器通常需要继承FClassLoader。

测试不同类使用的类加载器

引言

  • 每个Class对象都会包含一个定义它的ClassLoader的一个引用。
  • 获取ClassLoader的途径
    -

说明

  • 站在程序的角度看,引导类加载器与另外两种类加载器(系统类加载器和扩展类加载器)并不是同一个层次意义上的加载器,引导类加载器是使用C++语言编写而成的,而另外两种类加载器则是使用Java语言编写而成的。由于引导类加载器压根儿就不是一个Java类,因此在Java程序中只能打印出空值。
  • 数组类的Class对象,不是由类加载器去创建的,而是在Java运行期JVM根据需要自动创建的。对于数组类的类加载器来说,是通过Class.getClassLoader()返回的,与数组当中元素类型的类加载器是一样的;如果数组当中的元素类型是基本数据类型,数组类是没有类加载器的。

代码举例

package T1;

public class ClassLoaderTest2 {
    public static void main(String[] args) throws ClassNotFoundException {
        // 关于基本类的  类的加载器
        ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();
        System.out.println(classLoader); // null,表示是引导类加载器

        // 关于自定义类的 类的加载器
        ClassLoader classLoader2 = Class.forName("T1.ClassLoaderTest2").getClassLoader();
        System.out.println(classLoader2); // sun.misc.Launcher$AppClassLoader@18b4aac2

        // ############关于数组的########

        // 与数组当中元素类型的类加载器是一样的
        String[] arrStr = new String[10];
        System.out.println(arrStr.getClass().getClassLoader()); // null,表示是引导类加载器

        ClassLoaderTest2[] ClassLoaderTest2Arr = new ClassLoaderTest2[10];
        System.out.println(ClassLoaderTest2Arr.getClass().getClassLoader()); // sun.misc.Launcher$AppClassLoader@18b4aac2

        // 基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载
        int[] intArr = new int[10];
        System.out.println(intArr.getClass().getClassLoader()); // null,表示不需要类的加载器

    }
}

【JVM】尚硅谷宋红康JVM系列1:内存与垃圾回收篇 文章目录 b站视频地址: https://www.bilibili.com/video/BV1PJ411n7xZ/?p=2 阅读详情

相关推荐

尚硅谷2020最新版宋红康JVM教程更新至中篇(java虚拟机详解,jvm从入门到精通)

1

Mason97的博客 1595

深入理解Java虚拟机——再谈类的加载器——第十二章——中篇

文章目录1:概述1.1 类加载器分类1.2 类加载器的必要性1.3 命名空间1.4 类加载器的基本特性2:类的加载器分类2.1 引导类加载器2.2 扩展类加载器2.3 系统类加载器2.4 用户自定义类加载器3:测试不同的类加载器4:ClassLoader源码解析4.1 ClassLoader的主要方法4.2 SourceClassLoader与URLClassLoader4.3 ExtClassLoader和AppClassLoader4.4 Class.forName()与ClassLoader.load

qq_44891295的博客 1677

在Unity3d使用yolov8的onnx模型

输出OUTPUTS是float32[1,35,8400],表示它会输出一个大小为[1, 35, 8400]的浮点数张量。这个输出张量的维度表示了检测到的目标的数量、每个目标的预测参数以及网格单元的数量。输出张量的第一个维度1表示检测到的目标数量。每个目标由35个值组成,表示目标的类别、置信度、边界框的坐标及10个特定点的位置。要取得8400个数据中置信度最高的数据,然后获取该数据其他channel的数据。运行结果:(蓝色是检测手的边框,红点是自定义的点),其中的四个数字分别表示不同的维度。

shenqingyu0605202324的博客 5601

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

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

繁依Fanyi的博客 1万+

HybridCLR热更新打包报错全解析:从原理到实战解决方案

热更新技术是现代游戏和应用开发中实现动态内容交付与Bug修复的核心机制,它允许开发者在无需重新发布完整应用的情况下更新代码逻辑。其原理通常涉及在运行时加载并执行新的代码模块,这要求框架在底层实现安全的代码隔离、内存管理与元数据桥接。在Unity生态中,HybridCLR作为基于IL2CPP的高性能热更新解决方案,通过补充元数据和AOT泛型引用技术,实现了对C#代码的原生级热更支持,显著提升了开发迭代效率与线上问题修复能力。然而,在实际的工程实践中,尤其是在面向Android、iOS等多平台打包构建时,开发者

weixin_29017445的博客 308

ROS机器人里程计模型

3.5 移动机器人系统模型 相信大家的机器人平台STM32端底层控制和机器人urdf建模都已经顺利完成了,在正式开始ros端编写机器人启动功能包之前,我们还不得不学习一些必要的理论知识。别担心数学不好,这里基本都是高中数学。下面我们开始,Are you ready? 没准备好也开始了。 3.5.1 常用坐标系系统模型 在移动机器人技术研究中,最为常用的坐标系统是笛卡尔坐标系统。而在SLAM算法研究中,有如下几个比较常见的笛卡尔坐标系统,它们分别为机器人坐标系XR YR OR 、传感器坐标系XS YS OS

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

类加载器 超详解:什么是类加载器,类加载器作用及应用场景,类加载时机,类加载的完整过程,类加载器分类

类加载器 超详解:什么是类加载器,类加载器作用及应用场景,类加载时机,类加载的完整过程,类加载器分类

qq_44700578的博客 7073

整流桥选型参数,结构原理,工艺与注意问题总结

整流桥(Rectifier Bridge)是一种电子元件,它的主要作用是将交流电(AC)转换为直流电(DC)。这种转换在许多电子设备中都是必要的,因为大多数电子元件和电路都需要直流电源来工作。本文对整流桥的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 2184

什么是类加载器,类加载器有哪些

类加载器(Class Loader)是Java虚拟机(JVM)的一部分,负责将Java类的二进制代码加载到内存中,并转换为可执行的Java字节码。它是Java语言的重要特性之一,为Java应用程序提供了动态加载和运行时扩展的能力。类加载器的主要职责是根据类的全限定名(Fully Qualified Name)在运行时定位并读取类的字节码。类加载器使用一种称为双亲委派模型(Parent Delegation Model)的机制来加载类。

Flying_Fish_roe的博客 2292

为什么devc++编译项目会失败?提示gcc无法正常启动...

根据你的描述,编译能正常进行时,只打开源文件并没有问题,问题主要出现在创建项目后编译失败,这通常与 Makefile 配置、环境变量、编译器路径设置等因素有关。你可以检查 Makefile 配置,验证 DevC++ 的编译器环境设置,或者尝试清理并重新配置项目。如果问题仍然存在,可以尝试重装 DevC++ 或重新配置工具链。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1375

lammps蒙特卡洛MC模拟案例

在lammps中,和MC相关的模拟命令有三个:fix gcmc、fix atom/swap、fix sgcmc。在一个lammps模拟中,mc和md可同时存在,间隔运行,所以设置fix sgcmc命令的同时,可以同时设置系综(nve、nvt或者npt)。lammps官网自带案例中也有一个fix sgcmc的案例,主要模拟FeCu合金的MC建模。sgcmc命令可应用到合金的模拟中,如短程有序模拟。MC运行间隔为100步,最终的浓度比例为0.02,也就是2%的Fe原子交换为Cu原子。大家好,我是小马老师。

lammps_jiayou的博客 1824

尚硅谷2020最新版宋红康JVM教程-目录

第一篇:内存与垃圾回收篇 最新版宋红康JVM教程-1-JVM简介 尚硅谷2020最新版宋红康JVM教程-2-类加载子系统 尚硅谷2020最新版宋红康JVM教程-3-运行时数据区概述及线程 尚硅谷2020最新版宋红康JVM教程-4-程序计数器 尚硅谷2020最新版宋红康JVM教程-5-虚拟机栈 尚硅谷2020最新版宋红康JVM教程-6-本地方法接口 尚硅谷2020最新版宋红康JVM教程-7-本地方法栈 尚硅谷2020最新版宋红康JVM教程-8-堆 尚硅谷2020

admin741admin的博客 2689

[QMT量化交易小白入门]-四、如何筛选优质可转债,并进行下单操作

通过上述步骤,成功地使用Python代码完成了可转债的筛选、数据处理和下单操作。当然,这只是一个基础的示例,实际投资中还需要考虑更多因素,如市场环境、资金管理、风险控制等。希望本文能为各位投资者提供一些有价值的参考,助力大家在投资道路上走得更远。

木头大左的博客 1728

尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-01-概述

引言 类加载器是JVM执行类加载机制的前提。 ClassLoader的作用:ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于它是否可以运

admin741admin的博客 370

手把手教你学simulink实例--基于Simulink的航空发动机控制系统设计与仿真

航空发动机是飞机的核心动力装置,其性能直接影响飞行器的安全性、经济性和可靠性。现代航空发动机控制系统需要具备高精度、快速响应和强鲁棒性的特点,以适应复杂的飞行环境和任务需求。本项目旨在使用MATLAB/Simulink平台,设计并实现一种适用于涡扇发动机的闭环控制系统,通过调节燃油流量、压气机叶片角度等控制变量,确保发动机在不同工况下稳定运行,并满足推力需求。

MHD0815的博客 275

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

尚硅谷2020最新版宋红康JVM教程-2-类加载子系统

类加载器的分类 文章目录类加载器的分类 JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类clalssLoader的类加载器都划分为自定义类加载器。 我们可以以看到,Extension Class Loader以及AppClassLoader间接继承了C

m0_49760452的博客 157

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

尚硅谷JVM从入门到精通宋红康版|第二章、类加载子系统

类加载子系统 概述 完整图如下 如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文

weixin_45759791的博客 1700

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【JVM第二篇--类加载机制】类加载器与双亲委派模型

一、什么是类加载器 在类加载过程中,加载阶段有一个动作是“通过一个类的全限定名称获取定义此类的二进制字节流”,虚拟机将这个动作交给应用程序,让其自行去决定怎么获取所需的类。而实现这个动作的代码就被称为类加载器。关于类加载过程,可以看我的上一篇博客《类加载过程》。 1、类与加载器 类加载器除了用于实现类的加载外,还用于确定一个类在虚拟机中的唯一性,也就是说类加载器还用于判断两个类是否相等。 想要判断两个类对象是同一个类,需要两个必要条件: ① 类的完整类名包括包名都必须一致 ② 加载这个类的类加载器必须是同

weixin_43760020的博客 324

让宝贝舍友理解JVM 第二弹 下(类加载子系统)

(:最近在看尚硅谷的JVM教程,把学到的知识点总结一下,让舍友看完也懂JVM。 尚硅谷2020最新版宋红康JVM教程 结合视频教程看更容易懂。 废话少说,立即开冲。 上一弹我们了解到完了类的加载过程,有兴趣的同学可以点击链接看文章 让宝贝舍友理解JVM 第二弹 上(类加载子系统) 文章目录类加载器的分类启动类加载器(引导类加载器):Bootstrap ClassLoader扩展类加载器(Extension ClassLoader)应用程序类加载器(系统类加载器):System ClassLoader(

weixin_44824500的博客 528

1_JVM体系结构与类加载系统

????来源Bilibili尚硅谷周阳老师JVM教程:JVM_周阳老师教程 1_JVM体系结构与类加载系统 JVM体系结构 JVM 的位置,JVM 是运行在操作系统之上的,它与硬件没有直接交互。 补充: HotSpot VM 是目前市面上高性能虚拟机的代表作之一。 它采用解释器与即时编译器并存的架构。 JVM 的整个体系结构图, 类加载子系统 类装载器 ClassLoader 完整细节图 类装载器 ClassLoader 的作用 : 负责加载 class 文件的,将 class 文件字节码内

多回头看一看 442

JVM笔记(黑马+尚硅谷+张龙整合笔记)

JVM笔记(黑马+尚硅谷+张龙整合笔记) hancoder2020-03-30 22:11:432254收藏33 分类专栏:JavaJVM文章标签:JVM笔记黑马尚硅谷张龙 版权 前要 本身整合了如下视频的笔记,并进行了整理:尚硅谷周阳、张龙、黑马程序员 黑马ppt非常好:https://download.youkuaiyun.com/download/hancoder/12834607 本文及JVM系列笔记地址:https://blog.youkuaiyun.com/hancod...

wangzhipeng47的博客 987

JVM第二章:类加载子系统

来源:尚硅谷宋红康老师授课资料 类加载子系统 概述 完整图如下 如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常

迦南学院 133

Java基础---JVM

文章目录JVM1、JVM位置2、JVM体系结构概览(1)类加载器ClassLoader(快递员)&执行引擎Execution Engine① 类加载器分类(考点)② getParent()(考点)③ 双亲委派机制---保证沙箱安全(2)本地方法栈/本地方法接口/本地方法库① 多线程的例子②Native Interface本地接口(3)PC寄存器Programme Counter Regis...

luyangsiyi的博客 626

类加载器(ClassLoader)

一篇文章认识类加载器

jc15274630894的博客 1402

Java - 类加载器

文章目录1. 类加载的过程2. 类加载器的分类2.1 启动类加载器 Bootstrap2.2 扩展类加载器 ExtClassLoader2.3 系统类加载器 AppClassLoader3. 双亲委派机制4. ClassLoader抽象类2.4 加载时机3. 参考资料 1. 类加载的过程 图片来源: 系统学习让你轻松定义java类加载器 类加载器的作用就是将.class文件加载到内存。 2. 类加载器的分类 2.1 启动类加载器 Bootstrap 启动类加载器属于JVM的一部分,C++实现。 负责加

从零开始的博客 1万+

Java classload 机制 详解

所以,可以很清楚的看到,加载一个类的过程,它是层层的像父类委托,然后在层层的向下加载。类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加载器,由父类加载器。应该检查抛出异常的类的类加载器和当前线程的上下文类加载器,从中可以发现问题的所在。它也不能代理给系统类加载器,因为它是系统类加载器的祖先类加载器。当出现找不到类的错误时,检查当前类的类加载器和当前线程的上下文类加载器是否正确。要加载类的接口,加载该接口的子类时,可以用接口引用,而不需要利用反射来实现。虚拟机来说,它们是不同的类。

2301_77783312的博客 2011
上一篇: 尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-01-概述
下一篇: 尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-04-ClassLoader源码解析
zgcadmin
博客等级 码龄9年 174粉丝 109原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值