当前位置: 首页 > news >正文

Java程序中,不同jar包,有2个完全相同的类,运行时的加载顺序

在Java程序中,如果有两个完全相同的类存在于不同的jar包中,那么在运行时究竟加载哪个类,主要取决于类加载器的类路径(Classpath)搜索顺序。

Java使用类加载器(ClassLoader)来动态加载类。当Java程序请求加载一个类时,类加载器会按照一定的顺序在类路径中搜索这个类。一旦找到,就会停止搜索并加载该类。如果后续在类路径中遇到了同名的类,它将被忽略,因为Java的命名空间内已经存在了这个类的定义。

类路径的顺序通常由应用程序启动时指定的-classpath参数或者环境变量(如CLASSPATH)定义。对于Web应用程序,这个顺序可能由Web容器(如Tomcat)的内部类加载策略决定。

示例场景

假设有两个jar包:A.jarB.jar,它们都包含了一个名为com.example.MyClass的类。如果在启动Java应用程序时类路径的设置是这样的:

java -classpath A.jar;B.jar Main

那么,类加载器将首先搜索A.jar。如果在A.jar中找到了com.example.MyClass,这个版本的类将被加载,而B.jar中的同名类将被忽略。

注意事项

  • 类加载器的委托模型:在Java中,类加载器采用委托模型。这意味着,当请求加载一个类时,类加载器首先会将这个请求委托给其父类加载器去尝试加载这个类。只有在父类加载器无法加载该类时,当前类加载器才会尝试自己加载该类。这一机制也会影响类的加载顺序。

  • 不同类加载器的隔离:如果两个相同的类是由不同的类加载器加载的,那么在Java虚拟机(JVM)中,它们实际上被视为不同的类,即使它们的全类名完全相同。

由于类路径中类的加载顺序可能导致不同的行为,因此在管理依赖和打包应用程序时需要格外小心,以避免类冲突或隐藏的错误。在实际开发中,工具如Maven和Gradle通过依赖管理帮助解决这类问题,允许开发者指定依赖项的版本,从而减少类冲突的可能性。

http://www.lryc.cn/news/358226.html

相关文章:

  • EI期刊的定金和尾款
  • python+pytest+pytest-html+allure集成测试案例
  • STL-priority_queue的使用及其模拟实现
  • pycharm连接阿里云服务器过程记录
  • 移动硬盘未格式化数据恢复及预防策略
  • MySQL数据库入门之视图、存储过程、触发器
  • Kafka原生API使用Java代码-生产者-分区策略-默认分区策略轮询分区策略
  • 网页中的音视频裁剪拼接合并
  • 【入门】使用sklearn实现的KNN算法:鸢尾花数据集分类预测
  • nss做题
  • ​第18章:JDK8-17新特性
  • 哈希表练习题(2024/5/29)
  • java —— 连接 MySQL 操作
  • 从 0 开始实现一个博客系统 (SSM 项目)
  • C++标准模板(STL)- C 内存管理库 - 分配并清零内存 (std::calloc)
  • 嵌入式开发面试问题总结(持续更新)
  • 意外发现openGauss兼容Oracle的几个条件表达式
  • 使用Keepalived提高吞吐量和负载均衡ip_hash.
  • 网络故障与排除(一)
  • C++之运算符重载
  • 使用springdoc-openapi-starter-webmvc-ui后访问swagger-ui/index.html 报错404
  • 深入理解计算机系统 家庭作业4.52
  • 深度学习:手撕 RNN(2)-RNN 的常见模型架构
  • 【Linux进程篇】Linux进程管理——进程创建与终止
  • Python爬虫实战(实战篇)—17获取【CSDN某一专栏】数据转为Markdown列表放入文章中
  • Go语言-big.Int
  • getContentView(mBinding.getRoot()); 会导致内存泄露吗?里面有SurfaceView ViewBinding
  • 基于transformers框架实践Bert系列6-完形填空
  • cesium绘制编辑区域
  • 数据库攻防之MySQL