当前位置: 首页 > news >正文

java入坑之类加载器

一、类加载机制

1.1类加载过程

类加载是Java虚拟机将类的字节码数据从磁盘或网络中读入内存,并转换成在JVM中可以被执行的Java类型的过程。类加载器是Java虚拟机的重要组成部分,负责加载和解析类的字节码,将其转换成Java虚拟机中的类对象,生成加载的类的二进制类数据并存储在方法区中。

类加载过程可以分为以下五个步骤:

1. 加载(Loading):通过类加载器将.class文件字节码读入内存,并生成对应的Class对象,其中包括编译器编译后的代码、静态常量等信息。

2. 验证(Verification):检验字节码文件是否符合Java虚拟机规范,包括是否有正确的魔数、版本信息、常量池中的常量的数据类型是否正确、操作码是否合法等。

3. 准备(Preparation):在内存中为类的静态变量分配内存并赋初始值(数值类型默认为0,对象类型默认为null)。这个过程也包括了给类的静态变量赋予正确的默认值。

4. 解析(Resolution):将类对其他类的引用转换成直接链接,检查类或接口是否在系统中被定义,将符号引用转变为直接引用。

5. 初始化(Initialization):执行类的初始化方法,包括静态变量赋值和静态块调用等操作,即JVM对类进行初始化赋值。如果该类有父类,则按继承层次逐级初始化父类。在执行初始化前,必须保证该类已经完成了加载、验证、准备和解析过程。

 1.2类加载器

类加载器ClassLoader

-负责查找、加载、校验字节码的应用程序

  • java.lang.ClassLoader
  • load(String className)根据名字加载一个类,返回类的实例
  • defineClass((String name,.bytel b,int off,,int len)将一个字节流定义一个类
  • findClass(String name)查找一个类
  • findLoadedClass(String name)在已加载的类中,查找一个类
  • 成员变量ClassLoader paren

Java虚拟机(JVM)中有四个级别的类加载器,分别是:

1. 启动类加载器(Bootstrap ClassLoader):负责加载%JAVA_HOME%/lib目录下的核心类库,如rt.jar等。

2. 扩展类加载器(Extension ClassLoader):负责加载%JAVA_HOME%/lib/ext目录下的扩展类库。

3. 应用程序类加载器(Application ClassLoader):负责加载应用程序classpath下的类。

4. 自定义类加载器(Custom ClassLoader):根据开发者的需要,定制自己的类加载器。

这四个类加载器按照父子关系依次排列,每个类加载器都有自己的加载路径和加载策略。在加载一个类时,它会先委托其父加载器进行加载,如果父加载器无法加载,则由它自己进行加载。如果都无法加载,则会抛出ClassNotFoundException异常。这种父子委托的加载方式被称为“双亲委派模型”。

 1.3双亲委派机制扩展

  • Java严格执行双亲委托机制
  • 类会由最顶层的加载器来加载,如没有,才由下级加载器加载
  • 委托是单向的,确保上层核心的类的正确性
  • 但是上级类加载器所加载的类,无法访问下级类加载器所加载的类
    • 例如,java.lang.String无法访问自定义的一个Test类
    • Java是一个遵循契约设计的程序语言,核心类库提供接口,应用层提供实现
    • 核心类库是BootstrapClassLoader加载
    • 应用层是AppClassLoader加载
    • 典型例子是JDBC和XML Parser等

补充

1.4ServiceLoader

  • 一个服务提供者会在jar包中有META-INF/services目录,里面放一个文件,名字同接口名字。内容的每一行都是接口的一个实现类https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html
  • load方法,可以用当前线程的类加载器来获取某接口的所有实现,当然也都是转为接口类来使用
  • 注意:此服务和ava9模块系统的服务略有差别,但是都能通过ServiceLoader:进行加载

1.5自定义类加载路径


 

自定义加载路径弥补类搜索路径静态的不足,前3个加载的路径都是运行前确定的
Java提供URLClassLoader

  • 程序运行时修改类的加载路径
  • 可从多个来源中加载类 

 1.6自定义类加载器

  • JVM四级类加载器严格遵循从上到下的加载机制
  • 自定义类加载器继承ClassLoader类,可重写loadClass和findClass方法
  • 不同层次的类加载器,加载同名的类,在JVM里面也算两个

相关文章:

java入坑之类加载器

一、类加载机制 1.1类加载过程 类加载是Java虚拟机将类的字节码数据从磁盘或网络中读入内存,并转换成在JVM中可以被执行的Java类型的过程。类加载器是Java虚拟机的重要组成部分,负责加载和解析类的字节码,将其转换成Java虚拟机中的类对象&am…...

登录Tomcat控制台,账号密码输入正确但点击登录没反应不跳转到控制台页面

在tomcat-users.xml里面可以查看登录tomcat控制台的账号密码,如果账号密码输入正确还是登录不进去,则很有可能是tomcat的账号被锁了(可在catalina.xxx.log里面查看)。tomcat账号被锁定后默认情况是不访问控制台后5分钟自动解锁&am…...

[黑马程序员Pandas教程]——Pandas缺失值处理

目录: 学习目标空值和缺失值查看缺失值 加载数据并通过info函数初步查看缺失值情况df.isnull().sum()空值数量统计Missingno库对缺失值的情况进行可视化探查 安装missingno库missingno.bar(df)缺失值数量可视化missingno.matrix(df)缺失值位置的可视化missingno.he…...

Mysql进阶-视图篇

介绍 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。…...

一种libuv实现websockets服务的解决方案

方法是libuv用多事件循环来驱动。说起来容易,做起来还是比下面的方法更容易: 上图是某位网友的方法代表子大部分网络资料。此方法对部署不友好,因为软件仓库提供的libwebsockets是不能用了。如何简化部署,利用好现有的软件仓库呢&…...

MobaXterm配置SSHTunnel

本地与远程服务器之间存在防火墙,防火墙只允许SSH端口通过,为访问远程服务器,我们可以借助MobaXterm来与SSH服务器建立隧道,使得防火墙外的用户能够访问远程服务器 配置 打开SSHTunnel 新建SSH tunnel 点击开启就生效了&…...

MySQL中的datetime和timestamp有什么区别

相同点: 存储格式相同 datetime和timestamp两者的时间格式都是YYYY-MM-DD HH:MM:SS 不同点: 存储范围不同. datetime的范围是1000-01-01到9999-12-31. 而timestamp是从1970-01-01到2038-01-19, 即后者的时间范围很小. 与时区关系. datetime是存储服务器当前的时区. 而timesta…...

如何开发一个求职招聘小程序?详细步骤解析与教程

一、确定需求和功能 在开发求职招聘小程序之前,需要明确需求和功能。通过对市场和用户需求的调研和分析,确定小程序需要具备哪些功能,如职位发布、简历投递、在线沟通、面试安排等。 二、选择开发方式 求职招聘小程序的开发方式有多种选择…...

安克创新音频算法工程师(应届生)招聘

职位描述: 负责音频处理算法的研发和优化,包括但不限于噪声抑制、回声消除、声反馈抑制、音效、声纹、唤醒、指令词识别等。 持续跟进国际前沿技术方向,预研端侧可落地的音频技术,打造技术影响力。 对音频处理系统进行模拟和实验…...

Ubuntu 22.04.3 LTS中安装singularity

文章目录 概要背景知识什么是singularity ? 安装流程1. 安装Go2. 下载Singularity3. 编译Singularity源代码 4. 验证安装是否成功singularity的使用安装open structure 小结 概要 这里主要记录singularity的安装和使用,安装过程中会出现相关的错误,所以…...

NVM安装node后提示没有对应npm包(即:无法将“npm”项识别为 cmdlet、函数、脚本文件)

背景 windows11 node版本降低到v12.22.12后,执行:nvm -v npm -v npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果 包括路径,请确保路径正确,然后再试一次。 所在位置 …...

路由器基础(十一):ACL 配置

访问控制列表 (Access Control List,ACL) 是目前使用最多的访问控制实现技术。访问控制列表是路由器接口的指令列表,用来控制端口进出的数据包。ACL适用于所有的被路由协议,如IP、IPX、AppleTalk 等。访问控制列表可以分为基本访问控制列表和高级访问控制…...

【今日文章】:如何用css 实现星空效果

【今日文章】:如何用css 实现星空效果 需求实现tips: 需求 用CSS 实现星空效果的需求: 屏幕上有“星星”,且向上移动。移动的时候,动画效果要连贯,不能出现闪一下的样子。 实现 这里我们需要知道,“星星”是…...

HackTheBox-Starting Point--Tier 1---Three

文章目录 一 题目二 实验过程 一 题目 Tags Web、Cloud、Custom Applications、AWS、AWS、Reconnaissance、Web Site Structure Discovery、Bucket Enumeration、Arbitrary File Upload、Anonymous/Guest Access译文:Web、云、定制应用程序、AWS、AWS、侦察、网站…...

Linux Alsa声卡驱动(2):Machine驱动

一:Simple Card Simple Card是ASoC通用的machine driver,可支持大部分标准声卡。 驱动:kernel/sound/soc/generic/simple-card.c compatible = "simple-audio-card"; 1、设备树属性 (1)协议 属性协议格式描述simple-audio-card,format i2si2s标准格式right_j…...

某综合性能源集团绩效考核设计项目纪实

——设置分层分类的考核指标、建立多维度评价体系,增加考核结果信服力 【客户行业】能源行业 【问题类型】薪酬管理 【客户背景】 某综合性能源跨国集团是一家专注于能源加工行业的民营跨国企业,业务覆盖能源工程建设、高端装备制造、能源勘探开发、专…...

ubuntu18.04 通过创建服务实现开机自启, 启动指定脚本

下面是具体的操作过程 切换目录到root cd /root/ 新建一个脚本 vi myscript.sh 添加内容:设置指定网卡的ip地址 (这里根据自己需要修改) #!/bin/bash ifconfig enp0s3 10.20.60.113 赋予执行权限 chmod x myscript.sh 新建一个服务 vi /etc/systemd/system/myscr…...

Tomcat 9.0.x 源码编译

文章目录 一、克隆源码二、构建 Maven1)在项目根目录中新建 pom.xml 文件2)然后 Add Maven Projects 三、在目录中增加 home 目录四、增加启动配置五、其它问题1)控制台乱码解决 2)启动后访问 localhost:8080 报错解决 一、克隆源…...

基于SSM的旅游管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...

多目标优化中的“latent action”是什么?

2020 NeurIPS 中的“latent action”: Our model defines latent action as a boundary that splits the region represented by a node into a high-performing and a low performing region. 这里的latent action代表一个边界(分类器)&…...

Python AOT编译成本如何从$280K/年压至$49K/年?2026前最后窗口期的6个不可逆决策点

第一章:Python AOT编译成本断崖式下降的战略本质Python 长期以来被诟病于运行时开销高、启动慢、内存占用大,其核心瓶颈在于 CPython 解释器的字节码解释执行机制。而近年来,以 Nuitka、Cython(搭配 --aot 模式)、以及…...

macOS安全分析利器:OpenClaw控制SecGPT-14B检测恶意文件

macOS安全分析利器:OpenClaw控制SecGPT-14B检测恶意文件 1. 为什么需要本地化的恶意文件检测 作为一名长期使用macOS的安全工程师,我一直在寻找一种既能保护隐私又能高效检测恶意文件的方案。传统的云查杀服务虽然方便,但涉及到上传敏感文件…...

利用快马平台快速构建b站a8直播观看页面原型

利用快马平台快速构建B站A8直播观看页面原型 最近想尝试开发一个B站A8直播的观看页面原型,主要想验证一下直播相关的技术方案。作为一个前端开发者,我深知从头开始搭建这样一个页面需要花费不少时间,特别是在处理视频流、弹幕互动和响应式设…...

新手必看:用Wireshark分析CTF流量题,手把手教你从抓包到找到Flag

从零玩转Wireshark:CTF流量分析实战指南 第一次打开Wireshark时,满屏跳动的数据包就像天书一样让人头晕目眩。但别担心,每个网络安全高手都曾经历过这个阶段。本文将带你走进CTF流量分析的世界,从最基础的Wireshark操作开始&#…...

Cockpit CMS监控与日志:10个实用技巧助你实时追踪系统运行状态

Cockpit CMS监控与日志:10个实用技巧助你实时追踪系统运行状态 【免费下载链接】cockpit Add content management functionality to any site - plug & play / headless / api-first CMS 项目地址: https://gitcode.com/gh_mirrors/coc/cockpit Cockpit …...

Blender插件使用指南:GI-Model-Importer建模工具详解

Blender插件使用指南:GI-Model-Importer建模工具详解 【免费下载链接】GI-Model-Importer Tools and instructions for importing custom models into a certain anime game 项目地址: https://gitcode.com/gh_mirrors/gi/GI-Model-Importer 欢迎来到GI-Mode…...

ai赋能开发:使用快马平台智能优化openclaw 101抓取控制算法

最近在优化一个机械臂抓取控制项目时,发现传统的手动调参和算法改进效率太低。正好尝试了InsCode(快马)平台的AI辅助开发功能,整个过程让我对智能化编程有了全新认识。下面分享用AI优化OpenClaw 101控制算法的完整经历: 原始问题分析 初始代码…...

如何为《以撒的结合:悔改》安装REPENTOGON扩展框架

如何为《以撒的结合:悔改》安装REPENTOGON扩展框架 【免费下载链接】REPENTOGON Script extender for The Binding of Isaac: Repentance 项目地址: https://gitcode.com/gh_mirrors/re/REPENTOGON REPENTOGON是一款针对《以撒的结合:悔改》的扩展…...

【Word排版】制表位实战:从入门到精通

1. 制表位到底是什么?为什么比空格更好用? 第一次用Word排简历时,我盯着参差不齐的工作经历栏发愁——明明按了20次空格键,为什么第二行的日期还是对不齐?直到同事教我按住Tab键,所有内容突然像军训列队般整…...

无人机新手必看:Remote ID和ADS-B到底选哪个?从原理到实战全解析

无人机新手必看:Remote ID和ADS-B到底选哪个?从原理到实战全解析 刚入手的无人机在阳光下闪着金属光泽,充电时发出的细微电流声让人心跳加速——直到你发现说明书最后一页印着"需遵守Remote ID或ADS-B监管要求"。这两个陌生术语瞬…...