java类的加载 ,类加载器以及双亲委派机制详细介绍

1_类的加载

路径

  1. 类的加载过程
  2. 类的加载时机

类的加载

  • 当程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类的所有信息存储到一个Class对象中

在这里插入图片描述

说明:Class对象是指java.lang.Class类的对象,此类由Java类库提供,专门用于存储类型的信息

类的加载机制

在以下情况下会加载类:

  1. 创建一个类的对象(第1次)

  2. 调用类的静态方法,静态变量 (第1次)

  3. 使用一个类的子类时 (第1次)

  4. 通过反射进行加载类

  5. java命令执行某一个类 (第1次)运行java程序

    public class HelloWorld{public static void main(String[] args){System.out.println("Hello World!");}
    }//编译: javac HelloWorld.java    //生成:HelloWorld.class  字节码文件
    //运行: Java HelloWorld   //使用java命令执行HelloWorld类(默认调用main方法)//底层: HelloWorld.main(null);
    

小结

问题1:Student.class文件中都包含什么内容?

  • 构造方法、成员变量、成员方法

在jvm执行某个类时,如果该类是第一次被执行:

  • 先把该类的.class文件读取到内存中
  • 基于.class文件创建一个Class对象(方法区)
    • Class对象中存储的是.class文件中的内容:构造方法、成员变量、成员方法
      • Class对象中存储的构造方法:构造器对象 Constructor对象
      • Class对象中存储的成员变量:字段对象 Field对象
      • Class对象中存储的成员方法:方法对象 Method对象
02_类加载器

路径

  1. 类加载器的作用
  2. 类加载器的分类
  3. 获取类加载器的方式

类加载器的作用

什么是类加载器?

  • 加载器是Java运行时环境的一部分,负责加载字节码文件

类加载器的作用:

  • 负责将磁盘上的某个class文件读取到内存并生成Class的对象

类加载器的分类:

Java中有三种类加载器,它们分别用于加载不同种类的class:

  • 启动类加载器(Bootstrap ClassLoader):用于加载系统类库<JAVA_HOME>\bin目录下的class,例如:rt.jar。
  • 扩展类加载器(Extension ClassLoader):用于加载扩展类库<JAVA_HOME>\lib\ext目录下的class。
  • 应用程序类加载器(Application ClassLoader):用于加载我们自定义类的加载器。

获取类加载器的方式

来自Class类型获取类加载器的方法:

public ClassLoader getClassLoader()  //返回该类的类加载器
//有些实现可能使用null来表示引导类加载器(启动类加载器)
//如果该类由引导类加载器(启动类加载器)加载,则此方法在这类实现中将返回 null 

代码实践:

//自定义类型
class Student{private int age;
}//测试类
public class Demo01 {public static void main(String[] args){//获取自定义类的类加载器//1. 先获取Student对应的Class对象Class<Student> cls = Student.class;  //2. 再通过该class对象获取类加载器ClassLoader loader = cls.getClassLoader();System.out.println("loader = "+loader);//ClassLoaders$AppClassLoader@2437c6dc//获取String类的类加载器ClassLoader loader2 = String.class.getClassLoader();System.out.println("loader2 = " + loader2);}
}

小结

类加载器的作用:

  • 把硬盘上的.class文件读取到内存中并创建Class对象

类加载器可以分为3种:

  • 引导类加载器(启动类加载器) 负载加载系统类库(java.lang包)
  • 扩展类加载器 负责加载jdk扩展的类库
  • 应用程序类加载器 负责加载程序员自己写的类
03_双亲委派机制

路径

  1. 3种类加载器的关系
  2. 双亲委派机制
  3. 双亲委派机制的好处

3种类加载器的关系

在这里插入图片描述

从上图可知,三种类加载器存在一定的关系:

  • 应用程序类加载器的父级类加器是扩展类加载器
  • 扩展类加载器的父级类加载器是启动类加载器

结论:这种关系称为类加载器的"双亲委派模型"

双亲委派机制

"双亲委派模型"的工作机制:

  • 某个"类加载器"收到类加载的请求,它首先不会尝试自己去加载这个类,而是把请求交给父级类加载器
  • 因此,所有的类加载的请求最终都会传送到顶层的"启动类加载器"中
  • 如果"父级类加载器"无法加载这个类,然后子级类加载器再去加载

“双亲委派模型"中,除了顶层的启动类加载器外,其余的类加载器都应当有自己的"父级类加载器”

小结

双亲委派机制:

  • 在使用一个类时,类并不会由应用程序类加载器来加载,而是由"双亲:启动类加载器、扩展类加载器"先来进行加载,当"双亲"无法加载时,才由应用程序类加载器来完成.class的加载及Class对象的创建

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

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

相关文章

解码语言的奥秘:Transformer 与传统 RNN 的比较

1. 引言 介绍自然语言处理的重要性以及 RNN 和 Transformer 在此领域中的应用。 2. 循环神经网络&#xff08;RNN&#xff09;的基本原理 简要介绍 RNN 的工作原理&#xff0c;包括其如何通过循环结构处理序列数据。 3. 自注意力机制 解释自注意力机制的概念&#xff0c;以…

【2024最新版】图解Mysql数据库配置、命令行及Workbench访问(Windows版本)

目录 1. 准备工作1.1 安装MySQL1.2 验证MySQL的环境变量 2. 环境变量配置3. 访问MySQL3.1 命令行访问MySQL3.2 Workbench访问MySQL 1. 准备工作 1.1 安装MySQL 如果您已经安装了MySQL&#xff0c;请从【2. Mysql 环境配置】开始&#xff1b;如果您没有安装MySQL&#xff0c;请…

[Gstreamer] gstbasesink 的 QOS 机制

前言&#xff1a; gstreamer里很多element都提供 QOS 机制&#xff0c;src&#xff0c;filter 和 sink 都有。Sink element 的 QOS 机制由 gstbasesink 统一提供。 qos (quality of service) 是一种评价机制&#xff0c;这个领域中都有这一概念&#xff0c;比如网络的qos。…

使用ffmpeg调整视频分辨率/帧率并保持高清晰度

1、原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg -i input.mp4 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-v…

java数组转列表

Arrays.asList 是 Java 中的一个方法&#xff0c;用于将数组转换为固定大小的列表。这个方法在 java.util.Arrays 类中定义&#xff0c;常用于将数组转换为 List 以便使用集合框架中的其他方法。 主要特性 转换数组为列表&#xff1a;将一个数组转换为一个 List&#xff0c;从…

【MySQL】数据库的索引机制

文章目录 前言1. 索引是什么2. 索引的优缺点2.1 优点2.2 缺点 3. 索引的操作3.1 创建索引3.2 查看索引3.3 删除索引 4. 索引的存储原理4.1 B树4.2 B树 结语 前言 在数据库中&#xff0c;我们经常使用到的操作就是查询&#xff0c;当数据量小的时候&#xff0c;查询的速度很快&…

COMSOL - 一个点光源是否总能照亮整个房间?

20 世纪 50 年代&#xff0c;数学家恩斯特施特劳斯&#xff08;Ernst Straus&#xff09;提出了一个有趣的问题&#xff1a;在一个侧壁由理想反射镜构成的任意形状的空房间里&#xff0c;一个点光源是否总能照亮整个房间&#xff1f;诺贝尔奖获得者罗杰彭罗斯&#xff08;Roger…

1S013485认证:企业腾飞的引擎

在全球化的今天&#xff0c;企业要想在激烈的市场竞争中立于不败之地&#xff0c;必须不断提升自身的综合实力。1S013485认证正是帮助企业实现这一目标的重要工具。获得这项认证&#xff0c;企业不仅能在市场竞争中占据优势&#xff0c;还能在多个层面实现质的飞跃&#xff0c;…

Linux下快速搭建jupyter远程连接-小白即可上手

如何设置jupyter远程连接 第一步 **[1] jupyter notebook --generate-config**此时&#xff0c;在~/.jupyter文件夹下就有 jupyter_notebook_config.py 第二步 vim jupyter_notebook_config.py在此文件最前面添加 c get_config() c.NotebookApp.ip * c.NotebookApp.passw…

mac m芯片下安装nacos

背景&#xff1a;最近再研究 下载地址&#xff1a; https://nacos.io/download/nacos-server/ 解压zip包 unzip nacos-server-2.3.2.zip启动 进入到bin目录下 ./startup.sh -m standalone访问可视化界面 账号密码都是nacos&#xff0c;进行登录即可&#xff0c;nacos的端口为…

还在为职场烦恼?六西格玛黑带培训来帮忙!

为什么现在越来越多的学员都直奔六西格玛黑带培训呢&#xff1f;别急&#xff0c;张驰咨询这就来给你们揭秘&#xff01; 首先&#xff0c;六西格玛这个名头可不是盖的&#xff01;它就像是企业管理的“超级英雄”&#xff0c;专门解决各种流程中的“小怪兽”——也就是那些影…

Hadoop3:MapReduce中的Shuffle机制

一、流程图 Shuffle是Map方法之后&#xff0c;Reduce方法之前的数据处理过程称。 二、图解说明 1、数据流向 map方法中context.write(outK, outV);开始&#xff0c;写入环形缓冲区&#xff0c;再进行分区排序&#xff0c;写到磁盘 reduce方法拉取磁盘上的数据&#xff0c;…

Appium+python自动化(二十五)- 那些让人抓耳挠腮、揪头发和掉头发的事 - 获取控件ID(超详解)

简介 在前边的第二十二篇文章里&#xff0c;已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置&#xff0c;那么还有没有其他方法来获取控件点击事件所需要的点击位置呢&#xff1f;答案是&#xff1a;Yes&#xff01;因为在不同的大小屏幕的手机上获取控件的坐…

[SAP ABAP] 汇总内表数据

在加入新数据记录时&#xff0c;将非数值字段具有相同内容记录的数值字段汇总 语法格式 COLLECT <wa> INTO <itab>. <wa>&#xff1a;代表工作区 <itab>&#xff1a;代表内表 示例1 结果显示&#xff1a;

多维度mysql性能优化手段实践

数据库优化维度有四个:硬件升级、系统配置、表结构设计、SQL语句及索引。 优化选择: 优化成本:硬件升级>系统配置>表结构设计>SQL语句及索引。 优化效果:硬件升级<系统配置<表结构设计<SQL语句及索引。 系统配置优化 保证从内存中读取数据 MySQL会在内…

【云原生】深入理解Pod的使用进行管理

深入理解Pod 文章目录 深入理解Pod一、介绍Pod1.1、什么是Pod1.2、Pod的特点1.3、Pod的用途1.4、Pod网络1.5、Pod存储1.6、Pod的工作方式 二、创建Pod2.1、命令行创建Pod2.2、资源清单创建Pod2.2.1、镜像拉取策略2.2.2、Pod重启策略2.2.3、部署资源2.2.4、删除资源 三、静态Pod…

Go语言之集合类型

个人网站&#xff1a; http://hardyfish.top/ 免费书籍分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-61545511-81795b?p3899 访问密码&#xff1a;3899 免费专栏分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-6…

浏览器扩展V3开发系列之 chrome.storage 的用法和案例

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 chrome.storage 是用于存储、获取用户数据的 API。当我们需要持久化存储数据时&#xff0c;比如&…

昇思25天学习打卡营第3天|linchenfengxue

ResNet50迁移学习 在实际应用场景中&#xff0c;由于训练数据集不足&#xff0c;所以很少有人会从头开始训练整个网络。普遍的做法是&#xff0c;在一个非常大的基础数据集上训练得到一个预训练模型&#xff0c;然后使用该模型来初始化网络的权重参数或作为固定特征提取器应用…

目标检测系列(四)-利用pyqt5实现yolov8目标检测GUI界面

1、pyqt5安装 Qt Designer&#xff1a;一个用于创建图形用户界面的工具&#xff0c;可轻松构建复杂的用户界面。它基于MVC架构&#xff0c;可以将界面设计与逻辑分离&#xff0c;使得开发更为便捷。在Qt Designer中&#xff0c;可以通过拖拽控件来灵活地调整界面&#xff0c;并…