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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 郭慕荣

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 修改类定义,实现运行时增强
应用场景使用点

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

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