jar包新玩法
想必大家都遇到过这样的一个情况
就是在引用了别人的jar包时候,调用里面的一些方法,发现,里面方法不能满足自己的需求。
这是很自然的,因为,无论哪家公司发布的功能jar包,都不能够满足所有的情况。
谁也无法预料到以后会变化出什么。
那么,我们该怎么办了?
我们拿一个工具类jar包做例子,hutool-all-xxx.jar
当我们调用它的下载文件方法时候,它的代码如下:
public static void downloadFiles(String url,String savePath) {
HttpUtil.downloadFile(url, savePath);
}
我们深入到jar包源码就可以看到如下内容:
/**
* 下载远程文件
*
* @param url 请求的url
* @param destFile 目标文件或目录,当为目录时,取URL中的文件名,取不到使用编码后的URL做为文件名
* @param timeout 超时,单位毫秒,-1表示默认超时
* @param streamProgress 进度条
* @return 文件大小
* @since 4.0.4
*/
public static long downloadFile(String url, File destFile, int timeout, StreamProgress streamProgress) {
if (StrUtil.isBlank(url)) {
throw new NullPointerException("[url] is null!");
}
if (null == destFile) {
throw new NullPointerException("[destFile] is null!");
}
final HttpResponse response = HttpRequest.get(url).timeout(timeout).executeAsync();
if (false == response.isOk()) {
throw new HttpException("Server response error with status code: [{}]", response.getStatus());
}
return response.writeBody(destFile, streamProgress);
}
会发现,这段代码的第18行无法传输参数和添加头部信息,所以就出现了无法满足我们需求的情况。
这个时候我们有三种处理方式(目前我知道的三种):
1.我们直接修改jar包。
修改jar包的方式很简单,但是很low,因为,万一官方临时修补了10几个bug,你这个jar包用还是不用了?
那么言归正传,如何修改jar包了?
首先,我们随便创建一个工程,在工程里创建一个package,和jar包中的package一样,然后,创建一个和jar包中一样的class,或者abstract等。把jar文件的内容粘贴过来,修改我们想修改的地方,比如这里,我们要在第18行添加头部信息和参数发送代码。添加好了后,我们clean一下自己的工程,便会编译出一个class文件,找到这个class文件,并且替换掉jar包中的该文件。
替换jar包中的class文件方法,把jar拷贝出来,用WinRAR工具查看内容,然后,找到里面的文件位置
接着把我们刚编译出来的class文件,拷贝到这个路径下,替换原文件即可。
2.采用Java的继承思想。
我们在工程中,创建自己的类,然后,继承jar包中的类,这样,我们创建的类,就可以使用jar包文件中的方法了,如果觉得方法不够用,我们就重写自己的方法,覆盖jar文件中的方法,这样,我们new出自己的子类对象时候,就可以看到所有的可用方法了。
3.copy方法。
我们直接查看jar源码,然后,把想修改的方法给copy出来,自己修改下,直接调用我们自己的方法即可。
比对之下,修改jar包的方式太麻烦,太low,太不实用了。
建议采用第二种方法,一方面体现了对Java继承思想,重写重载思想的灵活运用, 一方面又轻松解决了自己的问题。
特别声明:hutool工具jar包非常实用,建议大家都下载使用。
我这里是因为对它还不熟悉,所以,在这个downloadFile这个方面处理的不好,由此,引发我写了这篇文章。
但并不代表hutool工具jar包不够好,它非常强大。
上一篇: 修改JAR包内容并重新打包
下一篇: Java打包找不到资源文件问题