一次修改jar包中字节码文件内容的尝试

背景

最近想实现按照分节符拆分doc / docx文档的功能,然后就找到了这篇文章Java 按节拆分 Word 文档,用的依赖是:

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.doc.free</artifactId>
    <version>5.2.0</version>
</dependency>

但是在使用过程中,出现了以下问题:

在这里插入图片描述

很明显的看到报错信息是段落数不能超过500行,否则就会报错,我们从网络上找到了该依赖所属公司的介绍,从下图可以看到报错的原因是加载该文档的时候段落数目超过了500行,然后就报错了

在这里插入图片描述

但是我不想被限制,那应该怎么办呢,我尝试了多种方式,发现最终的解决方案是更改jar包中
字节码文件中的数量限制来临时性解决该问题

解决办法

确定修改位置

首先分享给大家的第一个工具是:jd-gui(Java反编译工具).exe,链接在下面,如下:

链接:https://pan.baidu.com/s/1OMW_m20ylmamucckbh7pMQ?pwd=l5ao

提取码:l5ao

然后我们可以通过该工具将jar包打开,之后我们点击File,在点击Save All Sources按钮将源码下载下来,如下:

在这里插入图片描述
之后我们在代码中搜索报错中的限制条件,搜索结果如下:

在这里插入图片描述
这种位置一共有四处,上面说明了对段落数量和表格数量的限制分别是500和25

现在我们已经确定了需要修改的代码是:

com.spire.doc.collections.DocumentObjectCollection#add

com.spire.doc.collections.DocumentObjectCollection#insert

得到字节码文件

由于jar包类似于zip,所以可以使用压缩工具进行解压缩,比如“360压缩”,解压完成之后,我们找到DocumentObjectCollection.class字节码文件

修改字节码文件

JavaBite下载信息如下所示:

链接:https://pan.baidu.com/s/162a_Mi-nmIeH42ZkLqFAgw?pwd=a4v9

提取码:a4v9

使用JavaBite工具打开字节码文件,然后找到add()和insert()方法,然后把里面的段落限制500和表格限制25改大一点,首先我们先打开JavaBite工具,然后把class文件加载到JavaBite工具中,如下:

在这里插入图片描述

然后找到add方法,如下:

在这里插入图片描述

首先我们看到数字500前面的字节码指令是sipush,该字节码指令的取值范围是-32768~32767,大家可以看这个文章来了解sipush的字节码指令范围iconst、bipush、sipush、ldc指令的区别,那我们把500调整为32766就可以了,此时我们在数字500上双击鼠标左键,然后修改完成直接确认退出就可以了,如下:

在这里插入图片描述

如果我们想要修改最多25个表格的限制,那就需要在下面找到数字25的位置,由于25前面的指令类型是bipush,这种取值范围是-128~127,那我们把字节码指令换成sipush就可以了,并且把数值有修改成32766就可以了

除此之外,我们还需要修改insert方法中的最多500个段落和25个表格的限制

可能你会有疑问,为什么不用ldc指令,原因是在ldc指令的数据需要放在常量池,这就比较麻烦了

可能也有同学会问到,既然会抛出异常信息,那为什么不删除athrow指令,因为删除之后执行方法会报错,错误提示本地变量表不一致,当我删除athrow指令之后,那么行数减少,但是本地变量表数量没少,这就造成了数量不一致,所以我们只能通过修改数量的方法来临时解决

组合jar包

DocumentObjectCollection.class字节码文件放回原来的位置,然后选中comMETA-INF目录,之后打成zip包即可,最终把zip包的后缀名改成jar即可,如下:

在这里插入图片描述
之后jar包就可以正常使用了

猜你喜欢

转载自blog.csdn.net/qq_42449963/article/details/130396955