JVM 之 类的装载机制

SpringBoot与锐浪报表服务器深度整合实战指南 本文详细介绍了SpringBoot与锐浪报表服务器的深度整合实战指南,包括环境准备、Windows/Linux系统配置、核心功能实现代码解析及常见问题解决方案。通过具体案例和代码示例,帮助开发者高效完成报表系统的集成与部署,提升企业级应用的报表处理能力。 阅读详情

看到网上有一道面试题:能不能装载自定义的 java.lang.String?
答案是否定的,我们能自定义一个java.lang.String,但是加载不进来。

我相信很多人在网上看到这样的答案“可以,但在应用的时候,需要用自己的类加载器去加载”。这个回答是错误的,现在我们来分析一下jvm在装载一个类的时候,是如何进行的。

双亲委派模型

当虚拟机接受到一个类的加载请求时,它将这个加载请求委派给父类加载器进行加载,只有当父类加载器自己无法完成加载请求时,子类加载器才会尝试自己加载。

那么系统自带的加载器有哪些呢?

1.启动类加载器BootstrapClassLoader:

是嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,启动类加载器无法被应用程序直接使用。

2.扩展类加载器Extension ClassLoader:

该加载器器是用JAVA编写,且它的父类加载器是Bootstrap,是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类库。开发者可以这几使用扩展类加载器。

3.统类加载器App ClassLoader:

系统类加载器,也称为应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Ext ClassLoader。

各个类加载器之间是组合关系,并非继承关系。

双亲委托模式的优点

1.避免重复加载。当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
2.安全性。如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患。

重写String

回到上面的面试题,我重写了一个java.lang.String的类

package java.lang;  

public class String {  

    public static void main(String[] args) {  
        System.out.println("Hello String");  
    }  

} 

运行之后会抛一个异常:
错误: 在类 java.lang.String 中找不到主方法, 请将主方法定义为:
public static void main(String[] args)

因加载某个类时,优先使用父类加载器加载需要使用的类。如果我们自定义了java.lang.String这个类,加载该自定义的String类,该自定义String类使用的加载器是AppClassLoader。

根据优先使用父类加载器原理,AppClassLoader加载器的父类为ExtClassLoader,所以这时加载String使用的类加载器是ExtClassLoader,但是类加载器ExtClassLoader在jre/lib/ext目录下没有找到String.class类。

然后使用ExtClassLoader父类的加载器BootStrap,父类加载器BootStrap在JRE/lib目录的rt.jar找到了String.class,发现已经加载过了,于是不会再加载我们自定义的类。

打破双亲委托机制

有些人看到这,就会想,那我们自定义一个类加载器,但是不实现双亲委托机制就好了,强行加载,就算重复了也不管。但是你会发现也不会加载成功,具体就是因为针对java.*开头的类,jvm的实现中已经保证了必须由bootstrp来加载。并且这个方法被final修饰的,是改不了的。

Oracle数据库安装图文教程 附百度云oracle Database 11g 安装包 一,Oracle数据库安装包下载 1.从Oracle官网下载所需的数据库安装包【下载需要注册登录Oracle账户】     http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2.此处有下载好的Oracle Database 11g Release 2  百度云网盘  提取码:z... 阅读详情

相关推荐

从零构建:openEuler WSL下的ARM交叉编译工具链自动化部署方案

本文详细介绍了在openEuler WSL环境下使用Ansible自动化部署ARM交叉编译工具链的方案。通过编写Ansible角色和Playbook,实现从基础环境配置到工具链安装、环境变量设置的一键部署,大幅提升嵌入式开发效率。方案支持多种ARM架构,并扩展了QEMU仿真、VS Code远程开发等实用功能,是嵌入式开发者的高效解决方案。

h3i4j的博客 382

Java:简述类的装载机制

应用程序可以自定义类加载器,父类加载器为AppClassLoader。

王小二(海阔天空) 1141

Fluent 2.5D动网格重构实战:涡旋压缩机复杂运动模拟指南

本文详细解析了Fluent 2.5D动网格重构技术在涡旋压缩机复杂运动模拟中的应用。通过对比传统方法,2.5D重构显著提升了计算效率和稳定性,特别适用于柱体类几何的网格处理。文章提供了从基础配置到参数优化的实战指南,包括关键设置步骤、常见问题排查及性能优化策略,帮助工程师有效解决动网格重构中的负体积和网格畸变问题。

weixin_28455801的博客 549

Java类加载机制(全套)

概述 在开始正文之前,我们先看两张图 。Java平台的理解?Java最显著的特性?Java是解释执行? 先看一下java程序的执行流程图 再看一下jvm的大致物理结构图 本文是我在学习jvm类加载机制的时候对网上的一些资料的整理和总结。本文将研究一下问题: 什么是类加载?类的加载过程(生命周期)?类什么时候初始化?类初始化顺序?类加载器、反射、字节码等一系列问题。 一、类加载机制概念 Jav...

weixin_33958366的博客 699

KDD 2025 | 人大团队提出多任务贝叶斯联邦学习算法,同时处理分类和回归

©PaperWeekly 原创 ·作者 |吕俊良单位 |中国人民大学统计学院本文介绍了中国人民大学统计学院的一篇关于多任务贝叶斯联邦学习的文章“Task Diversity in Bayesian Federated Learning: Simultaneous Processing of Classification and Regression”,本文被 KDD 2025 接收,代码已经...

Paper weekly 2746

反激电源反馈环路设计:UC3842的FB脚与COMP脚接法对比与选型

在开关电源设计中,PWM控制器与光耦的反馈环路接法直接影响系统稳定性与动态响应。UC3842作为经典电流模式控制器,其FB脚和COMP脚分别对应内部误差放大器的输入与输出,决定了环路补偿由内部还是外部承担。FB脚接法利用内部基准和运放,设计简单、成本低,适合小功率适配器;COMP脚接法旁路内部运放,补偿网络外置,动态响应快、精度高,适合中大功率工业电源。理解两种接法的原理与差异,有助于在反激电源设计中优化环路补偿,提升负载调整率和批量一致性。

weixin_31887307的博客 316

深入理解Java:类加载机制与反射

一、Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java

fengjie_123的专栏 677

【AI生成】 LoRa无中心自组网实现方案

LoRa技术是一种低功耗广域网通信技术,它采用了扩频频率调制技术,能够实现远距离的传输。LoRa在物联网中具有重要的应用价值,可以支持大规模的设备连接并且具有较低的成本。同时,LoRa具有高度的抗干扰能力和适应性,能够在复杂的环境中实现稳定的通信。通过使用无中心自组网实现方案,可以进一步提高LoRa网络的灵活性和可靠性,实现设备之间的智能互联。LoRa无中心自组网实现方案将为物联网应用提供更加便捷和高效的通信解决方案。LoRa无中心自组网实现方案一、无中心自组网概念及优势。

qq_31310977的博客 2089

java 类装载机制_Java 类加载机制

1、什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在java堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class 对象。Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。2、 类的加载过程JVM 将类的加载过程分...

weixin_35511255的博客 677

从PWM到正弦波:RC低通滤波器的魔法转换之旅

本文详细介绍了如何利用RC低通滤波器将STM32F103生成的PWM信号转换为高质量正弦波的技术原理与实践方法。通过分析滤波器设计、参数计算、硬件实现及Proteus仿真验证,为嵌入式开发者提供了一套完整的PWM转正弦波解决方案,适用于电机控制、音频信号生成等多种应用场景。

jupi8的博客 380

BurpSuite+安卓模拟器双保险:避开真机抓包限制的完整配置指南

本文详细介绍了如何通过BurpSuite与安卓模拟器(如雷电、夜神)协同工作,绕过真机抓包限制的完整配置指南。从环境准备、网络拓扑配置到证书部署和流量分析,提供了一套高效的解决方案,帮助安全测试人员稳定捕获手机数据包,提升测试效率。

Apple的专栏 439

Java类加载机制(通俗易懂版)

类是在运行期间第一次使用时,被类加载器动态加载至JVM。JVM不会一次性加载所有类。因为如果一次性加载,那么会占用很多的内存。Java类加载机制是指在Java程序运行时,将类文件加载到内存中的一系列步骤。Java的类加载机制遵循着“按需加载”的原则,也就是说,只有在需要用到某个类的时候,才会将这个类的相关信息加载到内存中。这种“按需加载”的设计使得Java程序具备了很好的灵活性和效率。

weixin_52572813的博客 1392

【33】软考软件设计师——算法题(二):贪心法与回溯法深度精讲|第4题进阶满分攻略

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第33篇,承接第32篇分治法与动态规划,聚焦**下午第4题算法大题进阶核心**,详解贪心法与回溯法两大高频难点算法。全文超4000字深度拆解贪心法核心原理、贪心选择性质、局部最优推全局最优的底层逻辑,厘清贪心算法适用边界与经典误区;深挖回溯法深度优先遍历思想、递归回溯三步流程、可行性剪枝与最优性剪枝两大核心技巧;全覆盖活动选择、零钱兑换、01背包贪心禁区、八皇后、全排列等软考必考经典题型;配套标准化算法框架代码、考场填空模板、剪枝优化实操案例

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 438

java类验证和装载顺序_JVM类加载机制—类的生命周期

虚拟机把描述类的数据文件(字节码)加载到内存,并对数据进行验证、准备、解析以及类初始化,最终形成可以被虚拟机直接使用的java类型(java.lang.Class对象),这就是java虚拟机的类加载机制。——《 深入理解java虚拟机》类的生命周期从类被加载进内存开始直到卸载出内存为止,类的生命周期包括 装载、验证、准备、解析、初始化、使用和卸载 7个过程,其中 验证、准备、解析 三个过程统称为链...

weixin_35335035的博客 152

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JVM类装载器机制

7. 类装载器 7.1. class装载验证流程 类加载全过程 加载-链接-初始化。 JVM把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成JVM可以直接使用的JAVA类型的过程。 加载:查找并加载类全限定名的二进制字节流,转为方法区数据结构(特殊的堆),在Java堆中生成对应的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。 注意:对于数组类,情况就有所不同,数组类本身不通过类加载器创建,它是由Java虚拟机直接创建的。但数组类与类加载器仍然有很密切的关系

gonghaiyu的博客 244

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

说一说JVM中的类加载机制中类的生命周期

JVM中类的生命周期

qq_74212030的博客 971

JVM加载class文件的原理

Java中的类文件是通过类装载器装载到JVM的。装载器有BootstrapLoader, ExtClassLoader, AppClassLoader三个,分别负责加载系统类,扩展累,和应用类。当碰到一个类需要加载时,类装载器会先请示其Parent使用其搜索路径帮忙载入,如果Parent找不到,那么才由自己依照搜索路径搜索类。 类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的

B.I.T 580

Java加载Class文件的原理机制

1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的类大致分为三种:     1.系统类     2.扩展类     3.由程序员自定义的类  3.类装载方式,有两种     1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式

deanfor119的专栏 619

8. JVM类装载的执行过程

《JVM类装载机制解析》 摘要: JVM类装载是将.class文件加载到内存并转换为可执行类型的关键过程,包含7个生命周期阶段:1)加载:获取字节流并生成Class对象;2)验证:确保字节流安全合规;3)准备:分配静态变量内存;4)解析:替换符号引用;5)初始化:执行<clinit>()方法进行静态初始化;6)使用:运行程序代码;7)卸载:垃圾回收释放资源。其中初始化阶段通过编译器自动生成的<clinit>()方法实现,该过程具有线程安全性,确保父类优先初始化。类装载机制支撑了Jav

weixin_73692078的博客 938

【转载】JVM加载class文件的原理2

1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的类大致分为三种: 1.系统类 2.扩展类 3.由程序员自定义的类 3.类装载方式,有两种 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中,...

t225com 88

JVM 工作原理和流程

作为一名Java使用者,掌握JVM的体系结构也是必须的。 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示: 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然...

tsundere_x的博客 168

JVM 加载 Class 文件的原理机制

JVM(Java虚拟机)加载Class文件的过程分为三个步骤:加载、连接和初始化。下面是对这三个步骤的详细总结:加载: 加载是指将Class文件中的二进制数据读取到内存中,并将其转换为方法区中的运行时数据结构。通过类的全限定名查找并定位到类的二进制数据文件。将类的二进制数据文件读入到内存中。将类的二进制数据转化为方法区中的运行时数据结构,包括类的常量池、字段和方法信息、类的访问标志等。连接: 连接是将已经加载到内存中的类的二进制数据进行验证、准备和解析的过程。

Flying_Fish_roe的博客 858

JVM加载class文件的原理和机制

JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。 由于 Java 的跨平台性,经过编译的 Java 源程序并不是一个可执行程序,而是一个或多个类文件。当 Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class 文件中的数据读入到内存中,通常是创建一个字节数组读入.class 文件,然后产生与所...

u011494298的博客 231

JVM 学习笔记(一)类加载机制和类装载器

目录 1. JVM 介绍 2. 类加载机制 2.1 装载(Loading) 2.2 链接(Linking) 2.2.1 验证(Verification) 2.2.2 准备Preparation 2.2.3 解析(Resolution) 2.3 初始化(Initialize) 2.4 类加载机制图解 3. 类装载器 (ClassLoader) 3.1 分类 3.2 图解类加载...

分享 AI 编程实战、踩坑经验与技术感悟 | 一个工程师的成长笔记 用代码讲故事,用实战验证理论,用图文让技术更易懂 博客即知识库,分享即成长 🌱 520

Java的类装载器

Java的类装载器 文章目录Java的类装载器一、定义二、JVM运行时产生的3个类装载器(ClassLoader)三、父子关系四、全盘负责委托机制 一、定义 类装载器是寻找类的字节码文件并构造出类在JVM内部表示对象的组件。 二、JVM运行时产生的3个类装载器(ClassLoader) 根装载器 ExtClassLoader 扩展类装载器 AppClassLoader 应用类装载器 根装载器不是ClassLoader 的子类, 它使用C++语言编写,因而在Java语言中看不到它。根装载器负责装载JRE的

hefrankeleyn的博客 312

Java进阶——JVM加载class文件的原理机制

回到顶部。

m0_67402564的博客 476

关于java类装载机制一些总结

一.定义:寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。 二.组成: java类装载器有三个装载器类组成:根装载器(Bootstrap Loader),扩展类装载器(ExtClassLoader)和系统类装载器(AppClassLoader); 1.根装载器: 是用C++编写的,装载jre中的核心类库,如rt.jar、charsets.jar等. 2.扩展类装载器: 装载jre目录下的ext中的jar类包. 3.系统类装载器:装

Mr. David 专栏 1258
上一篇: Java 的 四种引用
下一篇: JVM 之 逃逸分析和TLAB
CallMeJiaGu
博客等级 码龄12年 149粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值