Java项目修改源码jar文件(无需反编译)

本文介绍了如何在项目中修改第三方jar包的源码,通过新建同名类并覆盖加载来实现,同时解释了项目本地类加载优先于依赖包、Maven的加载规则以及双亲委派机制带来的安全性。最后强调了此类操作的限制和注意事项。
摘要由CSDN通过智能技术生成

在这里插入图片描述

应用场景

在项目中用了第三方的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包类文件的目的。

注意事项

  1. JDK源码中以 java. 开头的类比如 Object 类等都无法使用此方法被覆盖替换,具体原因可以参考双亲委派机制。
    在这里插入图片描述
    双亲委派机制:
  • 主要是为了安全性,避免用户自己编写的类动态替换Java的一些核心类,比如Object,String。
  • 同时也避免了类的重复加载,因为JVM中区分不同类,不仅仅是根据类名,相同的class文件被不同的ClassLoader加载就是不同的两个类。
  1. 一般不建议使用此方式修改jar源码,如果使用的话在项目版本升级时需要注意,该新建的类需要在最新版本的基础之上进行正确修改,防止串版本问题!另外,做好备注,防止后续开发人员不理解相关代码。

在这里插入图片描述

### 回答1: jar文件Java语言常见的一种打包文件格式,它将多个Java文件、资源文件和其他文件打包成一个文件。一般情况下,jar文件是已经编译成机器码的二进制文件,无法直接查看其的源代码。但是,通过使用反编译工具,我们可以将jar文件的字节码还原成Java代码。 在进行jar文件反编译时,我们通常会使用一些专门的反编译工具,如Java Decompiler、JD-GUI等。这些工具能够将jar文件的字节码重新转换成Java代码,并呈现给我们查看和分析。 使用这些反编译工具,我们可以对jar文件代码进行查看、修改和学习。例如,我们可以查看第三方库的源码,了解其实现原理;或者对某个jar文件进行定制修改,以适应特定需求。 需要注意的是,虽然反编译可以还原代码的结构和逻辑,但无法还原原始的变量名和注释。这是因为在编译过程Java代码的变量名和注释会被编译器丢弃,只保留了与机器码执行有关的信息。因此,在反编译后的代码,我们可能会看到一些类似"var1"、"var2"这样的临时变量名,而注释则可能被省略或被替换成了一些默认的注释。 总之,通过反编译jar文件,我们可以获取到其Java代码,从而进行代码的分析和修改。这对于学习和项目调试等方面都起到了重要的作用。 ### 回答2: jar文件是一种Java语言的归档文件格式,可以将多个Java文件打包成一个文件反编译指的是将已经编译过的二进制文件(如jar文件)转换回可读的源代码。 要反编译一个jar文件Java源码,我们可以使用各种反编译工具,例如JD-GUI、Java Decompiler、FernFlower等。 首先,我们需要将jar文件导入到反编译工具。这些工具通常提供一个用户界面,让我们可以轻松地导入并查看jar文件的内容。在工具的界面上,我们可以看到jar文件包含的类文件和资源文件的列表。 接下来,我们可以选择一个或多个类文件,并使用反编译工具将其转换成可读的Java源码。这些工具通常会将反编译后的源代码显示在一个编辑器或浏览器窗口,使我们能够查看和编辑源代码。 需要注意的是,由于编译后的二进制文件丢失了一些原始代码的信息(如变量和方法名),所以反编译后的源码可能不会与原始源代码完全相同。此外,反编译后的源码可能也会缺少一些编译器优化后的改进。 总结起来,jar文件反编译Java源码是一种将已编译的二进制文件转换回可读的源代码的过程。通过使用反编译工具,我们可以将jar文件的类文件转换成可读的Java源码,以便于我们查看和编辑源代码。但需要注意的是,反编译后的源码可能与原始源代码存在一些差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霁晨晨晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值