0

0

Java里ClassLoader常用方法有哪些_Java类加载工具说明

P粉602998670

P粉602998670

发布时间:2026-01-03 12:47:27

|

657人浏览过

|

来源于php中文网

原创

classloader.loadclass() 不执行静态初始化,因只完成加载和链接,跳过初始化阶段;需用class.forname()或显式调用initialize=true触发。

java里classloader常用方法有哪些_java类加载工具说明

ClassLoader.loadClass() 为什么不能执行静态初始化?

这是最常被误解的点:loadClass() 只负责「加载 + 链接(验证、准备)」,但跳过「初始化」阶段,所以类里的 static { ... } 块不会运行,static final 字段也不会被赋值(除非是编译期常量)。

如果你需要触发初始化,必须显式调用 Class.forName(String)(它默认 initialize = true),或对返回的 Class 对象调用 Class.forName(name, true, classLoader)

  • ClassLoader.getSystemClassLoader().loadClass("com.example.MyClass") → 不触发 static
  • Class.forName("com.example.MyClass") → 触发初始化
  • 自定义 ClassLoader 重写 loadClass() 时,若想保持语义一致,不要擅自调用 resolveClass(c),除非你明确需要链接

getResource() 和 getResourceAsStream() 的路径行为差异

两者都走双亲委派,但路径解析逻辑不同:它们把传入的 String name 当作「相对于 classpath 根目录」的资源路径,且不自动补前导斜杠。常见错误是写成 "/config.properties" —— 这会导致从 classpath 根开始找,而多数人实际想的是「当前类所在包下」。

正确做法取决于意图:

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

妙刷AI
妙刷AI

美团推出的一款新奇、好玩、荒诞的AI视觉体验工具

下载
  • 想查当前类同包下的 logback.xml:用 this.getClass().getResource("logback.xml")(无斜杠)
  • 想查 classpath 根下的 META-INF/MANIFEST.MF:用 getClass().getClassLoader().getResource("META-INF/MANIFEST.MF")(无斜杠,根路径即 classpath 起点)
  • getResourceAsStream()getResource() + openStream() 的快捷封装,失败时直接返回 null,不抛异常
URL url = clazz.getResource("application.yml"); // 注意:不是 "/application.yml"
InputStream is = clazz.getResourceAsStream("log4j2.xml"); // 返回 null 表示没找到,不报错

findClass() vs defineClass():自定义 ClassLoader 的分工边界

如果你要实现自己的 ClassLoader(比如热加载、沙箱隔离),必须重写 findClass(String name),而不是直接重写 loadClass() —— 后者破坏双亲委派模型,容易引发 LinkageError 或重复加载。

findClass() 负责「获取字节码」(例如从网络、数据库、加密文件读取),然后交给 defineClass() 完成校验和转换为 Class 实例。注意:defineClass()protected final,不可重写,且要求字节数组格式合法(符合 JVM class 文件规范)。

  • 不要在 findClass() 中调用 super.loadClass(),否则绕过双亲委派
  • 不要手动 new Class 对象,JVM 禁止这样做
  • 如果字节码来自非标准来源(如解密后),需确保 defineClass()name 参数与字节码内部的全限定名严格一致,否则抛 NoClassDefFoundError

Thread.currentThread().getContextClassLoader() 的真实用途

这个 ClassLoader 不是“当前类”的加载器,而是线程绑定的、可由上层框架设置的代理加载器。典型场景是 SPI(如 JDBC 驱动加载、JAX-WS、SLF4J 绑定):核心库(由 Bootstrap 或 Extension ClassLoader 加载)需要加载用户提供的实现类,但它自己无法访问应用类路径,于是委托给上下文 ClassLoader。

所以你在写框架代码时,如果需要动态加载业务方的类(比如插件、策略类),应优先使用:

  • Thread.currentThread().getContextClassLoader() —— 多数 Spring/Java EE 场景下它指向 AppClassLoader
  • 慎用 MyClass.class.getClassLoader(),它可能只是某个 jar 包自己的 ClassLoader(如 OSGi BundleClassLoader)
  • Web 应用中,Servlet 容器(如 Tomcat)会在线程进入时设置上下文 ClassLoader 为当前 WebApp 的 ClassLoader

漏掉这一步,SPI 就会失效;设错 ClassLoader,就会出现 ClassNotFoundException 即使类明明在 classpath 里。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

117

2023.10.26

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

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

171

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、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

169

2024.02.23

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

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

157

2024.02.23

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

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

200

2024.02.23

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

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

244

2024.02.23

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

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

167

2024.02.23

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

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

精品课程

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

共23课时 | 4万人学习

C# 教程
C# 教程

共94课时 | 10.5万人学习

Java 教程
Java 教程

共578课时 | 75.2万人学习

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

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