惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LINUX DO - 热门话题
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky
J
Java Code Geeks
腾讯CDC
博客园 - 聂微东
The Cloudflare Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Last Week in AI
Last Week in AI
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Schneier on Security
C
CERT Recently Published Vulnerability Notes
Latest news
Latest news
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
有赞技术团队
有赞技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Securelist
AWS News Blog
AWS News Blog
GbyAI
GbyAI
L
LINUX DO - 最新话题
大猫的无限游戏
大猫的无限游戏
Forbes - Security
Forbes - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Attack and Defense Labs
Attack and Defense Labs
C
CXSECURITY Database RSS Feed - CXSecurity.com
Y
Y Combinator Blog
W
WeLiveSecurity
T
Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Proofpoint News Feed
D
DataBreaches.Net
博客园 - 三生石上(FineUI控件)
V
V2EX
N
News and Events Feed by Topic
Google DeepMind News
Google DeepMind News
D
Docker
The Hacker News
The Hacker News
A
About on SuperTechFans
Security Latest
Security Latest
NISL@THU
NISL@THU
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
博客园_首页
H
Hacker News: Front Page

博客园 - 郭慕荣

彻底搞懂 Codex Skill 与插件:区别、试用、核心作用、项目落地全指南(程序员实战向) Codex Skill 和插件到底有什么区别?程序员如何在项目中落地使用 claudecode 配置防止配置文件泄露总结 Claude code分析外部文件总结 Claude code三种模式详解 hasCompletedOnboarding详解 Claudecode 有哪些常用的命令 claude.md文件详解 claude code 的setting文件详解 Docker部署zookeeper总结 Mac中git ssh的配置(GitLab) 如何监控和调优JVM性能? jvm常用的参数有哪些? 怎么配置? hashmap 和currenthashmap 的原理?详解一下 aop在项目中使用的场景?怎么使用? Java dubbo spring springboot中的spi机制 spring中常见的两种代理模式 Redis的zset 面试汇总 drools 规则引擎在线化配置 springcloud中常用的注解详解 springcloud中网关gateway总结 spring是怎么解决循环依赖的? MySQL 死锁 怎么处理? 在写left join的时候 是大表在左侧 还是小表在左侧(二) 在写left join的时候 是大表在左侧 还是小表在左侧(一) nacos客户端(接口调用者)如何感知被调用服务下线? (二) nacos客户端(接口调用者)如何感知被调用服务下线?(一) 在MySQL中 redolog undolog binlog 写入的场景,顺序
Java 类加载机制 面试题(一)
郭慕荣 · 2025-10-31 · via 博客园 - 郭慕荣

🧩 一、核心概念:什么是类加载机制?

类加载机制(Class Loading Mechanism) 是 JVM 把 .class 文件中的字节码加载到内存、并在运行时动态链接、初始化为可用的 Java 类的过程。

Java 的类加载是 动态的,即在程序运行过程中按需加载类。


🚀 二、类加载的完整过程(重点)

Java 类从被加载到可用,共经过以下 5 个阶段

阶段说明关键点
1. 加载(Loading) 读取 .class 文件字节流 → 转化为方法区的 Class 对象 可从文件系统、网络、JAR、加密源加载
2. 验证(Verification) 确保字节码文件合法、安全 防止恶意代码破坏 JVM
3. 准备(Preparation) 为类变量(static)分配内存并设置默认值 不会执行任何赋值语句
4. 解析(Resolution) 将常量池中的符号引用 → 转换为直接引用 动态绑定的核心步骤
5. 初始化(Initialization) 执行静态代码块、静态变量赋值 按定义顺序执行,类正式可用

⚠️ 面试高频问:
Q:类加载的哪个阶段会执行静态代码块?
✅ A:初始化阶段


🧠 三、类加载器(ClassLoader)体系

Java 使用双亲委派机制来加载类,主要的类加载器有:

类加载器说明加载的类
Bootstrap ClassLoader 启动类加载器(C++ 实现) 加载 rt.jar(核心类库,如 java.lang.*)
Extension ClassLoader 扩展类加载器 加载 ext 目录下的 JAR 包
AppClassLoader 应用类加载器 加载 classpath 下的类
自定义 ClassLoader 用户自定义加载逻辑 实现热加载、隔离、插件机制等

🔄 四、双亲委派机制(Parent Delegation)

机制定义:
当一个类加载器加载类时,会先请求父加载器尝试加载,父加载器无法加载时,才由当前加载器自己加载。

好处:

  1. 避免重复加载;

  2. 保证核心类(如 java.lang.Object)只被 Bootstrap 加载;

  3. 提高系统安全性。

工作流程:

代码示例:


⚔️ 五、打破双亲委派机制(面试常考)

有时为了支持框架或插件的动态加载,需要打破双亲委派机制

典型场景:

  • Tomcat、JNDI、OSGi、SPI机制、热部署等;

  • 不同应用模块需要加载不同版本的同名类。

实现方式:

  • 重写 loadClass() 方法,而不是只改 findClass()

  • 让子加载器优先加载指定类(Parent First → Child First)。


💥 六、类的主动使用 vs 被动使用(加载时机)

JVM 只在 类的主动使用 时才会触发类加载与初始化。

主动使用包括:

  1. new 实例化对象;

  2. 访问类的静态变量、调用静态方法;

  3. 反射调用;

  4. 初始化子类(父类先初始化);

  5. JVM 启动时加载主类;

  6. 动态语言引用(MethodHandle、VarHandle)。

被动使用(不会触发加载):

  • 访问 final static 编译期常量;

  • 获取类的 Class 对象(如 A.class);

  • 创建数组(A[] arr)。


🧩 七、常见面试问法与答题套路

面试问题答题要点
JVM 类加载的过程是怎样的? 5 步:加载 → 验证 → 准备 → 解析 → 初始化
什么是双亲委派机制? 子加载器先委托父加载器,防止重复加载与安全问题
什么时候会触发类加载? 类的主动使用场景
如何破坏双亲委派机制? 重写 loadClass(),让子类优先
哪个阶段会执行静态代码块? 初始化阶段
自定义类加载器的作用是什么? 热部署、插件隔离、加密加载等
类加载器之间的隔离与共享是怎么实现的? 通过父子关系和命名空间机制实现
Tomcat 为什么要打破双亲委派? 为不同 WebApp 实现类隔离,支持同名类不同版本

⚙️ 八、调试验证示例

输出:

说明 Class.forName() 会触发初始化,而 Demo.class 不会。


🧩 九、类加载在实际项目中的应用

应用场景使用点
Spring 反射 + 类加载实现 IOC、AOP、BeanDefinition
Tomcat 每个 WebApp 独立 ClassLoader,打破双亲委派
Dubbo / SPI 根据配置动态加载实现类
Flink / Spark 作业热加载、用户 jar 包隔离
JVM Agent 通过 Instrumentation 修改类定义,实现运行时增强

🧾 十、总结一句话记忆口诀

加载验证准解析,初始化时才执行。
委派机制保安全,打破隔离框架现。