应用场景
在项目中用了第三方的jar包,但是jar包内某个类不符合项目业务需求,需要修改第三方jar包源码文件内容。
实现方案
首先我们尝试直接修改jar包源码文件内容时,页面上会提示文件是只读的,无法修改。
下面演示文件修改的完整步骤:
1.找到需要修改的方法的所在类,查看其中的路径;
2.在我们的项目src
目录下新建一个同包名同类名
的类;
3.将jar包中的重写方法所在类的所有代码
复制到我们新建的同包名同类名的类中;(如果新类有依赖问题可以将相关的依赖源码一并复制过来)
4.在我们新建的同包名同类名的类中修改对应的方法中的代码,注意要保持原类中已有方法中的参数
不要发生改变,也不要删除
原类中已有的方法,但是可以新增
一些方法。
首先我们在修改之前测试看一下效果
<!-- 第三方Java工具包类库 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.3</version>
</dependency>
通过测试我们发现方法运行正常,而且我们点击类引用
的位置并没有跳转到jar源码而是跳转
到我们刚才创建的新类。
下面尝试修改部分代码看一下效果
再次运行代码可以看到运行结果是新的类方法,并没有使用源码的方法。
实现原理
1、项目本地类的加载顺序优先于依赖包中的类
2、Maven遇到同名类,在pom文件中先声明的先加载
编译输出的时候会
优先使用
我们src下面的类,而不是优先使用Jar包里面的类,这样就达到了覆盖jar包类文件
的目的。
注意事项
- JDK源码中以
java.
开头的类比如Object
类等都无法使用此方法被覆盖替换,具体原因可以参考双亲委派机制。
双亲委派机制:
- 主要是为了安全性,避免用户自己编写的类动态替换Java的一些核心类,比如Object,String。
- 同时也避免了类的重复加载,因为JVM中区分不同类,不仅仅是根据类名,相同的class文件被不同的ClassLoader加载就是不同的两个类。
- 一般
不建议
使用此方式修改jar源码,如果使用的话在项目版本升级时需要注意,该新建的类需要在最新版本
的基础之上进行正确修改,防止串版本
问题!另外,做好备注
,防止后续开发人员不理解相关代码。