02_类加载子系统

news2024/11/24 22:38:35

目录

    • 1、Jvm内存结构概述
    • 二、类加载器与类的加载过程
      • 1、类加载器子系统的作用
      • 2、类的加载过程
    • 三、类加载器的分类
      • 1、启动类加载器
      • 2、扩展类加载器
      • 3、应用程序类加载器
      • 4、用户自定义加载器
      • 5、获取ClassLoader的几种方式
    • ==五、双亲委派机制==
      • 1、什么是双亲委派机制
      • 2、双亲委派机制的工作原理
      • 3、demo验证
      • 4、双亲委派机制的优势
      • 5、沙箱安全机制
    • 六、其他一些要点
        • 1、判断JVM中两个class对象是否相等
        • 2、对类加载器的引用
        • 3、类的主动使用和被动使用

1、Jvm内存结构概述

在这里插入图片描述

二、类加载器与类的加载过程

1、类加载器子系统的作用

在这里插入图片描述

2、类的加载过程

在这里插入图片描述

三、类加载器的分类

在这里插入图片描述
如何获取四种类型的类加载器

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

        //获取系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2

        //获取其上层:扩展类加载器
        ClassLoader extClassLoader = systemClassLoader.getParent();
        System.out.println(extClassLoader);//sun.misc.Launcher$ExtClassLoader@1540e19d

        //获取其上层:获取不到引导类加载器
        ClassLoader bootstrapClassLoader = extClassLoader.getParent();
        System.out.println(bootstrapClassLoader);//null

        //对于用户自定义类来说:默认使用系统类加载器进行加载
        ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
        System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2

        //String类使用引导类加载器进行加载的。---> Java的核心类库都是使用引导类加载器进行加载的。
        ClassLoader classLoader1 = String.class.getClassLoader();
        System.out.println(classLoader1);//null
    }
}

1、启动类加载器

在这里插入图片描述

2、扩展类加载器

在这里插入图片描述

3、应用程序类加载器

在这里插入图片描述

public class ClassLoaderTest1 {
    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());
        }
        //从上面的路径中随意选择一个类,来看看他的类加载器是什么:引导类加载器
        ClassLoader classLoader = Provider.class.getClassLoader();
        System.out.println(classLoader);

        System.out.println("***********扩展类加载器*************");
        String extDirs = System.getProperty("java.ext.dirs");
        for (String path : extDirs.split(";")) {
            System.out.println(path);
        }
        //从上面的路径中随意选择一个类,来看看他的类加载器是什么:扩展类加载器
        ClassLoader classLoader1 = CurveDB.class.getClassLoader();
        System.out.println(classLoader1);//sun.misc.Launcher$ExtClassLoader@1540e19d
    }
}

在这里插入图片描述

4、用户自定义加载器

1)为什么需要自定义类加载器

2)用户自定义类加载器的实现步骤

5、获取ClassLoader的几种方式

在这里插入图片描述

public class ClassLoaderTest2 {
    public static void main(String[] args) {
        try {
            //1. 获取java.lang.String的类加载器
            ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();
            System.out.println(classLoader);
            //2. 获取当前线程的类加载器
            ClassLoader classLoader1 = Thread.currentThread().getContextClassLoader();
            System.out.println(classLoader1);

            //3. 获取系统类加载器的父加载器
            ClassLoader classLoader2 = ClassLoader.getSystemClassLoader().getParent();
            System.out.println(classLoader2);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

五、双亲委派机制

1、什么是双亲委派机制

在这里插入图片描述

2、双亲委派机制的工作原理

在这里插入图片描述

3、demo验证

自定义一个 java.lang包,并在其中定义一个String类
在这里插入图片描述
在测试方法中加载该类:
在这里插入图片描述
结果: 静态代码块【System.out.println(“我是自定义的String类的静态代码块”);】没有执行,说明加载到内存中的并不是自定义的java.lang.String。由于双亲委派机制,实际上是通过引导类加载器加载的java核心类库中的String类
在这里插入图片描述
打印加载String类的加载器:结果是null,表明确实是引导类加载器
在这里插入图片描述
双亲委派机制:反向委派
在这里插入图片描述

4、双亲委派机制的优势

在这里插入图片描述

5、沙箱安全机制

在这里插入图片描述

六、其他一些要点

1、判断JVM中两个class对象是否相等

在这里插入图片描述

2、对类加载器的引用

3、类的主动使用和被动使用

在这里插入图片描述

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

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

相关文章

Windows上SVN迁移至Linux

1.从windows导出svn文件 bat脚本 echo offsvnadmin dump E:\Repositories\3goodsoft_carbon_admin > D:/test/3goodsoft_carbon_admin.dump svnadmin dump E:\Repositories\3goodsoft_android > D:/test/3goodsoft_android.dump svnadmin dump E:\Repositories\3g…

chatgpt赋能python:Python如何在指定目录下创建文件

Python如何在指定目录下创建文件 Python是一种流行的编程语言,因为它易于学习、易于使用和非常灵活。其中一个常见的任务是在指定目录下创建文件,这在编写应用程序或脚本时经常需要。在本文中,我们将介绍使用Python在指定目录下创建文件的方…

第05章 数组

一 数组的概述 1.1 为什么需要数组 需求分析1: 需要统计某公司50个员工的工资情况,例如计算平均工资、找到最高工资等。用之前知识,首先需要声明50个变量来分别记录每位员工的工资,这样会很麻烦。因此我们可以将所有的数据全部…

chatgpt赋能python:Python如何取消空格

Python如何取消空格 在Python编程中,取消字符串中的空格是一个常见的需求。特别是在进行字符串处理和数据清洗时,取消空格可以方便数据的分析和处理。在本次文章中,我们将介绍使用Python语言如何取消字符串中的空格,以及一些常见…

如何将会议录音转文字?你知道如何将会议录音转文字吗?

会议录音转文字的需求在现代工作和生活中变得越来越重要。随着会议的频繁举行,我们常常需要记录会议内容以便后续查阅和分析。而传统的手动记录方式效率低下且容易出错。幸运的是,现在有许多会议录音转文字的应用程序可供选择,它们可以将会议…

uniPush2.0踩坑实录

首先,按照下面链接,把预备工作做完,基本可以实现dcloud后台网页推送: uniPush2.0 消息推送_没有白天的CXY的博客-CSDN博客 第二步,走完本流程后,会遇到各种坑,一个一个来踩: 第一坑…

龙芯2K1000实战开发-处理器硬件接口测试(下)

文章目录 概要整体架构流程技术名词解释技术细节小结概要 提示:这里可以添加技术概要 龙芯 2K 集成了 USB、SATA、PCIE 等高速串行接口,在板级测试时需要按照相应的 规范发出测试波形。本文档对这些接口分别介绍了发出测试波形的方法 整体架构流程 提示:这里可以添加技术…

电子企业如何快速部署一套MES生产管理系统

电子企业如何快速部署一套MES生产管理系统 引言 在数字化时代,电子企业的发展离不开高效的生产管理。MES生产管理系统是生产管理的核心工具,可以帮助电子企业提升生产效率和产品质量。本文将介绍电子企业快速部署一套MES生产管理系统的步骤和优势&…

C++算法:排序之三(堆排序)

C算法:排序 排序之一(插入、冒泡、快速排序) 排序之二(归并、希尔、选择排序) 排序之三(堆排序) 排序之四(计数、基数、桶排序) 文章目录 C算法:排序二、比较…

全排列--回溯

1题目 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#xff1a…

关于Spring中自带的@Schedule实现自动任务

SpringBoot中自带了一个能够实现定时任务的注解Schedule 如果定时任务比较简单,则可以使用SpringBoot中自带的Schedule,但是如果任务调度很复杂的话,就建议使用Quartz组件了。 说一下这个Schedule注解怎么用? 基本使用 第一步&a…

Centos8之系统升级

一、centos8系统简介 CentOS 8是一个基于Red Hat Enterprise Linux(RHEL)源代码构建的开源操作系统。它是一款稳定、可靠、安全的服务器操作系统,适合用于企业级应用和服务的部署。CentOS 8采用了最新的Linux内核和软件包管理系统&#xff0c…

chatgpt赋能python:Python如何分行——提高代码可读性和效率的必备技能

Python如何分行——提高代码可读性和效率的必备技能 什么是分行? 分行,即将一行长代码分为多行,使得代码更加易读、易维护、易修改。 Python作为一门高级编程语言,具有简洁、易读、高效的特点。但在实际编程过程中,…

Amazon Device EDI 数据库方案开源介绍

近期为了帮助广大用户更好地使用 EDI 系统,我们根据以往的项目实施经验,将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后,只需要下载我们整理好的示例代码,并放置在知行之桥指定的工作区中,即可开始使用。 …

C++调python程序示例

背景 平台:Xavier nvidia AGX板子 编写c程序测试单目3D目标检测DEVIANT(https://blog.csdn.net/qq_39523365/article/details/130982966?spm1001.2014.3001.5501)python算法的过程。代码如下: 文件结构 具体代码: …

基于 prefetch 的 H5 离线包方案 | 京东云技术团队

前言 对于电商APP来讲,使用H5技术开发的页面占比很高。由于H5加载速度非常依赖网络环境,所以为了提高用户体验,针对H5加载速度的优化非常重要。离线包是最常用的优化技术,通过提前下载H5渲染需要的HTML/JS/CSS资源,加…

如何用Arcgis做一个地区的温度或降水量分布图

1.首先需要拥有一张shp格式的研究地区的矢量区域图(很多网站都可以下载到全国各地区县域或者省域界线的矢量图,比如小木虫),以山西省为例: 2.导入本研究区域样地或样点的经纬度、温度(或降水)的csv格式数据…

我与 InsCODE AI 创作助手的一次对话

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 我与INDCODE AI 创作助手的一次对话 🧊摘要🧊前言🧊对话内容🧊结束语 🧊摘要 本文介绍了 CSDN 嵌入式INSCODE AI 创作助手…

华为OD机试真题 Java 实现【跳格子2】【2023 B卷 100分】,附详细解题思路

一、题目描述 小明和朋友玩跳格子游戏,有n个连续格子组成的圆圈,每个格子有不同的分数,小朋友可以选择从任意格子起跳,但是不能跳连续的格子,不能回头跳,也不能超过一圈。 给定一代表每个格子得分的非负整…

【项目】GCC(gcc,g++)、静态库的制作与使用、动态库

GCC、静态库 1.2 GCC(1)gcc(1)常用命令(2) C程序编译过程(3)GCC工作流程 1.3 GCC(2)g1.3静态库的制作1.5静态库的使用1.6动态库的制作1.7动态库加载失败的原因1.8解决动态库加载失败…