0

0

在Java中类加载器如何工作_JavaClassLoader原理解析

P粉602998670

P粉602998670

发布时间:2026-02-11 01:47:36

|

315人浏览过

|

来源于php中文网

原创

loadClass执行双亲委派:先查是否已加载,再委托父加载器,父返回null时才调用findClass;不可随意重写loadClass,应只重写findClass并调用defineClass。

在java中类加载器如何工作_javaclassloader原理解析

loadClass 方法到底做了什么

loadClass 是类加载的入口,但它本身不负责真正读取字节码,而是执行「双亲委派」逻辑:先检查类是否已被加载(findLoadedClass),再委托父加载器尝试加载;父加载器返回 null 时,才调用 findClass 由自己查找并定义类。

常见错误现象:自定义类加载器重写了 findClass 却没调用 super.loadClass,导致 java.lang.String 等核心类被自己的加载器重复加载,触发 LinkageError

  • 不要直接重写 loadClass —— 除非你明确要破坏双亲委派(如 OSGi、热部署)
  • 正确做法是继承 ClassLoader,只重写 findClass,并在其中调用 defineClass
  • defineClass 是受保护方法,它把 byte[] 转成 Class 对象,但不触发初始化;若需立即初始化,得额外调用 resolveClass

为什么 Bootstrap ClassLoader 显示为 null

当你执行 String.class.getClassLoader(),结果是 null,这不是 bug,而是设计使然:启动类加载器(Bootstrap ClassLoader)由 C++ 实现,不属于 Java 类体系,JVM 不暴露其实例引用。

这直接影响你判断类来源的逻辑。比如想区分一个类是不是 JDK 自带类,不能只靠 getClassLoader() == null,因为某些框架(如 Spring Boot 的 DevTools)会用特殊加载器加载基础类,也可能返回 null 或伪造实例。

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

  • 更稳妥的方式是检查包名前缀:className.startsWith("java.") || className.startsWith("javax.")
  • 或用 ClassLoader.getSystemClassLoader().getParent() 获取 ExtClassLoader,再逐级向上判断(但 Bootstrap 仍不可达)
  • 注意:JDK 9+ 引入模块系统后,getResources("META-INF/MANIFEST.MF") 等行为可能因模块封装而失效

自定义类加载器绕过双亲委派的典型场景

双亲委派是默认安全策略,但不是铁律。真实项目中常需打破它,比如:实现插件隔离(各插件加载自己的 log4j 版本)、热更新(替换正在运行的类)、或加载加密/远程字节码。

IBM Watson
IBM Watson

IBM Watson文字转语音

下载

关键点在于:绕过 ≠ 彻底抛弃。多数场景只需局部绕过,例如仅对特定包路径下的类跳过委派,其余仍走父加载器。

  • 重写 loadClass 时,先判断类名是否属于「应由我加载」的范围(如 com.myapp.plugin.*),是则直接 findClass;否则走 super.loadClass
  • 务必避免加载 java.*javax.*sun.* 等包——否则极易引发 NoClassDefFoundErrorSecurityException
  • 类卸载依赖 GC,而 ClassLoader 实例若被静态引用持有(如缓存 map 未清理),会导致整个加载的类无法回收,引发内存泄漏

getResource 和 getResources 容易被忽略的细节

getResource 返回单个 URL,getResources 返回枚举,二者都遵循双亲委派:先查父加载器,再查自身路径。但它们不校验资源是否存在,只返回第一个匹配到的路径(getResource)或全部路径(getResources)。

典型坑:Spring 的 ClassPathResource 默认用当前线程上下文类加载器(Thread.currentThread().getContextClassLoader()),而 Web 容器(如 Tomcat)会切换它——如果你在 Filter 或 Listener 中手动 new 一个类加载器却没设 context,资源就找不到了。

  • 调试时可用 classLoader.getResources("application.properties") 查看所有匹配路径,确认资源是否真被加载器“看见”
  • 注意路径分隔符:用 "/",不是 "\\""."getResource("com/example/Config.class") 中的点不会自动转斜杠
  • 如果资源在 jar 包里,URL.getProtocol() 通常是 "jar",需用 URL.openConnection().getInputStream() 读取,不能直接 new FileInputStream

类加载器真正的复杂性不在机制本身,而在它和线程、模块、容器、安全管理器之间的隐式耦合——一次看似简单的 Class.forName 调用,背后可能横跨三个类加载器、两个线程上下文、一个模块层叠和一套自定义安全管理策略。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

115

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

170

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

167

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

154

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

199

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

237

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

166

2024.02.23

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

50

2026.02.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.4万人学习

C# 教程
C# 教程

共94课时 | 9.1万人学习

Java 教程
Java 教程

共578课时 | 62.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号