讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里类加载机制是如何工作的_Java类加载流程解析

夜辰小哥_1260

夜辰小哥_1260

发布时间:2026-02-23 07:43:17

|

473人浏览过

|

来源于php中文网

原创

Java类加载是按需触发的懒加载过程,由ClassLoader.loadClass()驱动并默认遵循双亲委派模型;仅在首次主动使用(如new、访问静态字段、Class.forName等)时触发,且loadClass()不负责链接和初始化,而Class.forName默认会初始化。

在java里类加载机制是如何工作的_java类加载流程解析

Java类加载不是一次性完成的,而是按需触发、分阶段推进的懒加载过程;核心逻辑由ClassLoader.loadClass()驱动,且默认遵循双亲委派模型。

类什么时候被真正加载?

JVM不会在启动时加载所有类,只在首次主动使用时触发加载——比如调用new、访问静态字段(非final常量)、反射Class.forName()、初始化子类(父类先加载)等。

  • 写ClassB b;但没实例化或引用静态成员 → 不触发加载
  • System.out.println(ClassA.SOME_STATIC_FIELD); → 触发ClassA加载(除非该字段是public static final编译期常量)
  • Class.forName("com.example.MyClass") → 强制加载并初始化(initialize = true默认);若只想加载不初始化,得用Class.forName(name, false, classLoader)

loadClass()到底做了什么?

这是ClassLoader中可被重写的入口方法,标准实现逻辑是:先查缓存 → 再委派父加载器 → 父无法加载才自己找字节码 → 最后调用defineClass()注册到JVM。

  • 缓存检查:已加载的类直接返回Class对象(避免重复加载)
  • 双亲委派:调用getParent().loadClass(name),直到Bootstrap加载器;它不继承ClassLoader,所以getParent()返回null
  • 自己加载:父返回ClassNotFoundException后,子类加载器才调用findClass(name)(这个方法你可重写)→ 读取字节流 → defineClass(name, bytes, off, len)交给JVM解析成运行时结构

⚠️ 注意:loadClass()不负责链接(验证/准备/解析)和初始化,这些由JVM在后续阶段自动完成;而Class.forName(String)默认会触发初始化。

JavaStoryDevelop
JavaStoryDevelop

你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在

下载

立即学习“Java免费学习笔记(深入)”;

为什么自定义类加载器要重写findClass()而不是loadClass()?

因为直接重写loadClass()会破坏双亲委派——你绕过父加载器,可能导致java.lang.String被你的加载器重复加载,引发LinkageError甚至JVM崩溃。

  • 正确做法:继承ClassLoader,只重写findClass(),并在其中调用defineClass()
  • 错误写法:public Class> loadClass(String name) { return defineClass(...); } → 跳过委派,危险!
  • 典型场景:热部署、OSGi、加密jar解密加载、从数据库或网络动态拉取class字节码

准备阶段给静态变量赋的是什么值?

准备阶段只设“零值”或“编译期常量值”,不是你代码里写的初始值。

  • public static int a = 123; → 准备阶段a = 0;真正赋值123在初始化阶段执行<clinit></clinit>方法时
  • public static final int b = 456; → 编译器生成ConstantValue属性,准备阶段就设为456(它是“编译期常量”,会被内联)
  • 数组类型如public static final int[] arr = {1,2}; → 不算编译期常量,仍走<clinit></clinit>初始化

这点直接影响类初始化时机判断,尤其在多线程环境下,static {}块是否已执行,得看是否走到初始化阶段——而这个阶段由第一个主动使用该类的线程触发,且JVM保证只执行一次。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
bootstrap框架介绍
bootstrap框架介绍

本专题整合了bootstrap框架相关介绍,阅读专题下面的文章了解更多详细内容。

745

2026.03.18

bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

199

2026.03.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6679

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn