类加载器详细介绍

类加载器我们要聊一个神秘而又重要的角色——Java类加载器。这家伙,就像是个超级英雄,总是在关键时刻挺身而出,为我们的Java程序提供强大的支持。我会尽量用简单易懂的方式来介绍它。 一 、类加载器介绍

1、类加载器是什么? 想象一下,你正在编写一个Java程序,里面用到了无数的类。这些类就像是乐高积木,组合在一起才能构建出强大的功能。但是,这些积木从哪里来呢?没错,就是类加载器!

类加载器就是Java虚拟机(JVM)用来加载Java类的工具。它就像是个快递员,负责把.class文件(也就是编译后的Java类)送到JVM手中,让JVM能够认识并使用这些类。

2、类加载器的分类

在Java的世界里,类加载器可是个大家族。它们有不同的角色和职责,但都是为了让Java程序更好地运行。

引导类加载器(Bootstrap ClassLoader):这是家族的老大,负责加载Java的核心类库,比如rt.jar、resources.jar等。它非常神秘,我们一般看不到它的庐山真面目。

扩展类加载器(Extension ClassLoader):这是老大的得力助手,负责加载Java的扩展类库,比如lib/ext目录下的jar包。它就像是老大的左右手,帮老大分担了很多工作。

系统类加载器(System ClassLoader):这是离我们最近的类加载器,负责加载应用程序的类路径(CLASSPATH)下的类库。它就像是我们的好朋友,总是第一时间满足我们的需求。

除了这三个主要的类加载器之外,我们还可以自定义类加载器,来满足一些特殊的需求。比如,我们可以实现一个网络类加载器,从网络上加载类文件;或者实现一个加密类加载器,对类文件进行加密保护。

3、类加载的过程

类加载的过程其实并不复杂,主要分为三个步骤:加载、链接(验证、准备、解析)和初始化。

加载:类加载器首先会去找到要加载的类的.class文件,然后读取这个文件的内容,并生成一个对应的Class对象。这个过程就像是快递员找到包裹并送到你手中的过程。

链接:链接过程包括验证、准备和解析三个阶段。验证阶段会检查类的合法性;准备阶段会为类的静态变量分配内存并设置初始值;解析阶段会把类中的符号引用转换为直接引用。这个过程就像是快递员在送货前对包裹进行检查、打包和标记的过程。

初始化:在初始化阶段,JVM会执行类的初始化代码(也就是静态代码块和静态变量的赋值操作)。这个过程就像是快递员把包裹送到你手中后,你打开包裹并使用里面的物品的过程。再例如图书馆管理员(JVM)负责管理和组织书籍(Java类)。管理员去书店采购新书(加载类的二进制字节流),将新书放在书架上(方法区),并为每本书分配一个唯一标识(java.lang.Class对象)。

之后,管理员会验证书的内容是否健康(验证类的正确性),并为书架预留空间(准备类的静态变量),了解每本书的结构(解析符号引用)。

最后,管理员开始整理书架上的书籍(初始化类),根据每本书的目录将书籍放到正确位置(执行静态代码块和静态变量赋值)。如果一本书的整理需要参考其他书籍,管理员会先确保那些书籍已被整理好(初始化会触发父类的初始化)。 这个例子类比了Java类加载过程中的加载、链接(验证、准备、解析)和初始化阶段。

二、重要知识点

1、类加载器的种类:

启动类加载器(Bootstrap Class Loader):也称为根类加载器,它是用C++编写的,不是Java类。它负责加载Java的核心类库,如java.lang.Object等。

扩展类加载器(Extension Class Loader):它负责加载Java的扩展类库,通常位于$JAVA_HOME/jre/lib/ext目录下。

系统类加载器(System Class Loader)或应用类加载器(Application Class Loader):也称为系统类加载器,它负责加载应用程序的类路径(CLASSPATH)下的类库。

自定义类加载器:开发者可以根据需要实现自定义的类加载器,这些类加载器必须继承自java.lang.ClassLoader类。

2、类加载器的双亲委派模型:

这是一个重要的概念,它描述了类加载器之间的层次结构和加载类的顺序。当一个类加载器需要加载一个类时,它首先会把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

3、类什么时候被初始化:

创建类的实例(即使用new关键字创建对象)。

访问某个类或接口的静态变量,或者对该静态变量赋值。

调用类的静态方法。

使用反射(如Class.forName("com.example.MyClass"))。

初始化一个类的子类(会首先初始化子类的父类)。

JVM启动时标明的启动类(即文件名和类名相同的那个类)。

4、自定义类加载器的用途:

加载非标准路径下的类文件。

实现类的热替换(在不重启JVM的情况下替换类的定义)。

加载网络上的类文件。

加密和解密类文件,以实现代码的保护。

5、类加载器与线程上下文类加载器:

线程上下文类加载器是Java提供的一个类加载器,它可以从执行线程中继承。这个类加载器为Java应用程序提供了一种更为灵活的方式来加载类。例如,在JDBC中,驱动类通常使用线程上下文类加载器来加载,以便更好地支持类路径的自定义和扩展。

三、总结提升

从架构设计角度来看,Java类加载器提供了许多值得借鉴的经验,这些经验在设计和构建复杂系统时非常有用。

1、模块化与层次化设计:

Java类加载器采用了模块化和层次化的设计,每个类加载器都负责加载特定范围的类。这种设计有助于实现类的隔离和共享,同时也使得系统更加灵活和可扩展。

在设计系统时,可以借鉴这种思想,将系统划分为不同的模块或组件,并为每个模块或组件配置相应的类加载器。这样可以实现模块之间的隔离和独立部署,减少模块之间的依赖和冲突。

2、双亲委派模型:

Java类加载器的双亲委派模型是一种经典的委托机制,它确保了Java核心类库的安全性和稳定性。当一个类加载器需要加载一个类时,它会首先将这个请求委派给父类加载器去完成。只有当父类加载器无法加载该类时,子类加载器才会尝试自己去加载。

在设计系统时,可以借鉴这种委托机制,实现组件之间的协作和通信。通过定义明确的接口和协议,组件可以将自己的职责委托给其他组件来完成,从而实现系统的解耦和复用。

3、动态加载与热替换:

Java类加载器支持动态加载类,即在运行时加载类文件并生成相应的Class对象。这种特性使得Java能够支持动态扩展和插件化。同时,结合自定义类加载器,还可以实现类的热替换,即在不重启JVM的情况下替换类的定义。

在设计系统时,可以借鉴这种动态加载和热替换的思想,实现系统的动态扩展和升级。通过动态加载新的模块或组件,可以扩展系统的功能;通过热替换类文件,可以在不中断服务的情况下修复bug或更新功能。

  由于篇幅限制,以下仅为精选的面试专题内容概览,涵盖多个技术领域。 全套JAVA面试笔记获取方式:若您对上述内容感兴趣并希望获取完整的面试笔记,请点击此处点击此处即可免费获取,助您面试成功! 具体内容包含:

- Java面试基础:涵盖Java语言核心知识、集合框架、多线程与并发编程基础等面试常考点。

- Spring框架深入:解析Spring框架的核心概念、IoC容器、AOP面向切面编程、Spring MVC等关键技术。

- JVM原理与实践:深入探索Java虚拟机的工作原理,包括内存模型、垃圾回收机制、类加载机制等。

- MyBatis持久层框架:解析MyBatis的映射文件配置、动态SQL、缓存机制等,以及如何高效地使用MyBatis进行数据库操作。

- Redis缓存技术:介绍Redis的数据结构、持久化机制、事务与管道、集群搭建等,及其在缓存系统中的应用。

- MySQL数据库管理:涵盖SQL语言基础、数据库设计原则、索引优化、事务处理、锁机制等MySQL高级特性。

- 并发编程实战:讲解多线程编程的并发控制、同步工具类、并发集合、Java并发包等,提升程序并发处理能力。

- 微服务架构:分析微服务架构的优势、服务拆分策略、服务治理、配置中心、API网关等关键技术点。

- Linux系统基础:介绍Linux常用命令、文件系统、进程管理、网络配置等系统运维基础知识。

- Spring Boot快速开发:展示Spring Boot如何简化Spring应用开发,包括自动配置、Spring Boot CLI、Starters等特性。

- Spring Cloud微服务解决方案:深入Spring Cloud的服务发现、配置管理、断路器、智能路由、微代理、控制总线等微服务组件。

- 消息队列(MQ)与Kafka:阐述消息队列的基本概念、使用场景,以及Kafka的高性能、可扩展性和持久性特性。

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

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

相关文章

【python设计模式2】创建型模式1

目录 简单工厂模式 工厂方法模式 简单工厂模式 简单工厂模式不是23中设计模式中的,但是必须要知道。简单工厂模式不直接向客户端暴露对象创建的细节,而是通过一个工厂类来负责创建产品类的实例。简单工程模式的角色有:工厂角色、抽象产品角…

Redis(redis基础,SpringCache,SpringDataRedis)

文章目录 前言一、Redis基础1. Redis简介2. Redis下载与安装3. Redis服务启动与停止3 Redis数据类型4. Redis常用命令5. 扩展数据类型 二、在Java中操作Redis1. Spring Data Redis的使用1.1. 介绍1.2. 环境搭建1.3. 编写配置类,创建RedisTemplate对象1.4. 通过Redis…

Linux入门学习:git

文章目录 1. 创建仓库2. 仓库克隆3. 上传文件4. 相关问题4.1 git进程阻塞4.2 git log4.3 上传的三个步骤在做什么 本文介绍如何在Linux操作系统下简单使用git,对自己的代码进行云端保存。 1. 创建仓库 🔹这里演示gitee的仓库创建。 2. 仓库克隆 &…

Zookeeper 3.8.4 安装和参数解析

安装 zookeeper 之前必须先安装 JDK,有关Linux环境JDK可以参考我以前写的博文 1、关于Linux服务器配置java环境遇到的问题 2、Linux环境安装openJDK 3、Centos7.3云服务器上安装Nginx、MySQL、JDK、Tomcat环境 文章目录 1. zookeeper 安装2. 参数解析 1. zookeeper …

VScode快速配置c++(菜鸟版)

1.vscode是什么 Visual Stdio Code简称VS Code,是一款跨平台的、免费且开源的现代轻量级代码编辑器,支持几乎 主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性,也拥有对git的开箱即…

[乱码]确保命令行窗口与主流集成开发环境(IDE)统一采用UTF-8编码,以规避乱码问题

文章目录 一、前言二、命令行窗口修改编码为UTF-8三、Visual Studio 2022修改编码为UTF-8四、Eclipse修改编码为UTF-8五、DevCPP修改编码为UTF-8六、Sublime Text修改编码为UTF-8七、PyCharm、IDEA、VS Code及Python自带解释器修改编码为UTF-8 一、前言 在学习的征途中&#x…

如何通过 4 种方法恢复 Mac 上删除/未保存的 Excel 文件

您花了数小时在 MacBook 上处理 Excel 工作簿,但现在它不见了。或者,当您退出 Excel 文件时,您无意中选择了“不保存”。这是否意味着您的所有努力都白费了?本文系统地解释了如何在 Mac 上恢复丢失的 Excel 文件。使用我们的 4 种…

如何在Android上实现RTSP服务器

技术背景 在Android上实现RTSP服务器确实是一个不太常见的需求,因为Android平台主要是为客户端应用设计的。在一些内网场景下,我们更希望把安卓终端或开发板,作为一个IPC(网络摄像机)一样,对外提供个拉流的…

Linux学习记录十四----------线程的创建和回收

文章目录 五、Linux线程1.守护进程1.1.守护进程的特点1.2.进程组1.3会话1.4创建守护进程模型 2.线程的概念3.线程的创建及相关函数3.1.创建线程‐‐pthread_create3.2.单个线程退出 --pthread_exit3.3.阻塞等待线程退出,获取线程退出状态--pthread_join3.4.线程分离…

无限制使用OpenAI最新o1-mini、o1-preview模型:经济高效的AI推理模型

OpenAI 最新推出的 o1 模型是该公司推理模型家族的首位成员,它通过创新的“思维链”训练模式,显著提升了逻辑推理和问题解决的能力。o1 模型在编程竞赛问题、数学奥林匹克资格赛以及物理、生物和化学问题的基准测试中表现出色,甚至在某些领域…

学成在线练习(HTML+CSS)

准备工作 项目目录 内部包含当前网站的所有素材,包含 HTML、CSS、图片、JavaScript等等 1.由于元素具有一些默认样式,可能是我们写网页过程中根本不需要的,所有我们可以在写代码之前就将其清除 base.css /* 基础公共样式:清除…

Tongweb7启动的时候显示要输入java参数(by lqw)

问题描述: 启动tongweb7的时候,提示要输入java参数,如下图所示: 原因: tongweb安装目录bin目录下的external.vmoptions文件改动,在# 符号后加多了一个空格。 external.vmoptions记录的是启动参数&#xf…

【读书】原则

后面的 太长了,而且太多了 我看作者 49年的 0多岁的老人的谆谆教诲 太多了 一下子吃不消 分为 生活原则 和 工作原则 倡导 人要以 原则而活 要做到极度透明 极度求真和极度透明:在软件开发中,对事实的执着追求和对信息的透明度是至关重要的。…

论文阅读 - SELF-REFINE: Iterative Refinement with Self-Feedback

https://arxiv.org/pdf/2303.17651 目录 Abstract Introduction 2 Iterative Refinement with SELF-REFINE Evaluation 3.1 Instantiating SELF-REFINE 3.2 Metrics 3.3 Results Abstract 与人类一样,大型语言模型(LLMs)并非总能在首次…

【刷题日记】螺旋矩阵

54. 螺旋矩阵 这个是一道模拟题,但我记得我大一第一次做这道题的时候真的就是纯按步骤模拟,没有对代码就行优化,导致代码写的很臃肿。 有这么几个地方可以改进。 看题目可以知道最终的结果一定是rows*cols个结点,所以只需要遍历rows*cols次…

java十进制码、六进制码和字符码的转换

一、字符转换为ASCII码: int i(int)1; 二、ASCII码转换为字符: char ch (char)40; 三、十六进制码转换为字符: char charValue (char)\u0040; package week3;public class check_point4_8 {public static void main(String[] args) {S…

Java 性能调优:优化 GC 线程设置

垃圾回收器使用一组称为 GC 线程的线程来执行回收工作。有时 JVM 可能会分配过多或过少的 GC 线程。本文将讨论 JVM 为什么会出现这种情况、其影响以及可能的解决方案。 1 咋查找应用程序的 GC 线程数量 进行线程转储分析来确定应用程序的 GC 线程数量: 从生产服…

【算法思想·二叉搜索树】基操篇

本文参考labuladong算法笔记[二叉搜索树心法(基操篇) | labuladong 的算法笔记] 1、概述 我们前文 东哥带你刷二叉搜索树(特性篇) 介绍了 BST 的基本特性,还利用二叉搜索树「中序遍历有序」的特性来解决了几道题目&am…

MathType7.9绿色和谐版激活补丁包下载

MathType7.9中文版:让你的数学公式更酷炫✨ 嘿,亲爱的数学迷们!今天我要给你们安利一款超级炫酷的数学公式编辑器——MathType7.9中文版。这款软件不仅能让你轻松输入各种复杂的数学公式,还能让你的公式看起来更加酷炫哦&#xf…

Java项目——苍穹外卖(二)

Redis 简介 Redis是一个基于内存的key-value结构数据库 基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛 基础操作 启动 在redis安装目录中打开cmd,输入如上图指令即可启动,按下crtl…