很多朋友在写java的程序的时候都喜欢用第三方的jar包和框架,有可能遇到jar包中的内容已经跟不上官方开发者文档的更新,导致部分内容出错了,这个时候可能就要放弃这个jar的使用,但是这个jar中的其他的东西都很好,这个时候我们应该怎么办呢。

首先,肯定是利用jd_gui.exe去解压jar包,然后修改源文件,再重新编译。这个方法比较率直。听起来思路不错,但是中途会遇到很多问题,比如修改完源文件之后,再编译的过程中,有包的名字和结构的问题出现,类似不再复述。

其次有一个方案是拷贝源码使用,并修改,这种方法有个缺点,就是当框架其他东西都很完美的时候,如果用源码,会显得结构复杂,而且一旦这个类使用到了该jar中的其他类的东西,那就需要把所有的src都拷贝出来。

所以,我们选择另外一个方式去更新jar包中的内容——继承。通过继承并修改有问题的类去解决问题。举个例子,我正在用wechat4j中的模板消息的类和函数去解决问题,但是这个框架中的关于模板消息的属性有一个topcolor,而最新版的微信开发者文档中,topcolor这个属性已经没有了,加进去之后,构造的json字符串会出错,导致解析失败,通过源码分析,我们知道关键的问题在于topcolor这个属性在构造字符串的时候被写入,所以我们继承TemplateMsg这个类

package service;

import org.apache.log4j.Logger;
import org.sword.lang.HttpUtils;
import org.sword.wechat4j.message.TemplateMsg;
import org.sword.wechat4j.message.template.TemplateMsgBody;
import org.sword.wechat4j.message.template.TemplateMsgData;
import org.sword.wechat4j.token.TokenProxy; import com.alibaba.fastjson.JSONObject; public class NewTemplateMsg extends TemplateMsg {
private static Logger logger = Logger.getLogger(TemplateMsg.class);
private String accessToken;
public NewTemplateMsg(){
accessToken=TokenProxy.accessToken();
}
public String send(TemplateMsgBody postData)
{
logger.info("send template message");
String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + this.accessToken;
JSONObject json = new JSONObject();
json.put("touser", postData.getTouser());
json.put("template_id", postData.getTemplateId());
json.put("url", postData.getUrl());
JSONObject jsonData = new JSONObject();
for (TemplateMsgData data : postData.getData()) {
JSONObject keynote = new JSONObject();
keynote.put("value", data.getValue());
keynote.put("color", data.getColor());
jsonData.put(data.getName(), keynote);
}
json.put("data", jsonData);
String data = json.toJSONString();
String result = HttpUtils.post(url, data);
logger.info("post result:" + result);
JSONObject resultJson = JSONObject.parseObject(result);
if (resultJson.getString("errcode").equals("0")) {
return resultJson.getString("msgid");
}
logger.error("send template message error:" + resultJson.getString("errmsg"));
return null;
}
}

重写这个TempleMsg的函数,去掉json.put("topcolor",postData.getTopcolor()),上面是已经修改完的代码,然后用这个新的类去代替旧的类去使用,

需要强调的一点,父类中的private属性并不可以被子类所调用,因此有些关键信息需要自己去补齐。

结束。

换个新的思路 代替解压jar包 例证:wechat4j 框架中的templateMsg类的更多相关文章

  1. [Java] Java 打包成jar包 和 解压jar包

    解压jar包 jar xf xxx.jar 打包成jar包 方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] ...

  2. jar 压缩 解压 war包

    Win+R 输入cmd进入命令行,进入到源码所在目录.所用工具,jdk自带的jar.exe 打包命令:jar -cvf xxx.war * 解包命令: jar -xvf xxx.war * 参数 说明 ...

  3. linux解压war包的命令

    网上很多人说用jar包解压,但jar命令解压时不能指定目录,推荐使用unzip解压war包. 一.命令名: unzip 功 能说明:解压缩zip文 件 语 法:unzip [-cflptuvz][-a ...

  4. redhat下安装mysql 5.6.20,解压zip包,查看已经安装过的mysql,卸载rpm安装包,安装mysqlserver端和client,改动mysqlusername,登陆mysql,启动关闭mysql

     1 将相关的mysql rpm包上传到redhat上 2  我的电脑是Redhat 6.*版本号.所以这里使用上面一个 3  解压zip包 4  安装下面几个rpm MySQL-client-a ...

  5. tar 只解压tar包中某个文件

    sh-4.1# ls test.tar sh-4.1# tar -tf test.tar ./ecs20161207.png ./ecs.png ./ecs.xml ./rds.png ./Scree ...

  6. linux 解压xz包

    1.下载xz包 http://tukaani.org/xz/xz-4.999.9beta.tar.bz2   2.解压安装包 $tar -jxvf xz-4.999.9beta.tar.bz2   3 ...

  7. tomcat解压war包的一点例外

    我在项目的开发过程中,发现Tomcat解压war 的一点例外.        现象如下: 使用ANT工具把web应用程序打包为war文件.然后把war文件放到tomcat的webapps,让tomca ...

  8. Unix系统解压tar包时出现@LongLink错误

    Unix系统上使用tar命令解压tar包后,多了一个@LongLink的文件,并且原来的tar包解压后不完整.网上查了下,原因是AIX系统上tar命令自身的一个缺陷.解决办法:把该tar包上传到lin ...

  9. java 解压 zip 包并删除

    需求是这样的,  在服务器上有 运营上传的zip 包,内容是用户的照片,我需要做的是 获取这些照片上传,并保存到 数据库. 这里面的 上传照片,保存数据库都不难,主要问题是解压zip包,和删除zip ...

随机推荐

  1. hive 搭建

    Hive hive是简历再hadoop上的数据库仓库基础架构,它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储,查询和分析存储再hadoop种的大规模数据机制,hive定 ...

  2. python成长之路-----day1----笔记(1)

    1.python语言介绍 python的创始人:Guido Van Rossum 2.python是一门什么样的语言 编程语言主要从以下几个角度进行分类:编译型,静态型,动态性,强类型定义语言和弱类型 ...

  3. 如何将一个Excel文件中的sheet移动到另外一个Excel?

    背景 工作中往往会有多个excel维护的情况,随着业务的变化, 将一个Excel合并到另外一个Excel,成为必须. 如何移动sheet,对于不会的人,这是一个好问题, 也许你经过多次尝试都没有成功. ...

  4. 从零开始攻略PHP(7)——面向对象(上)

    1.理解面向对象的概念 面向对象软件的一个重要优点是支持和鼓励封装的能力.封装也叫数据隐藏. 在面向对象的软件中,对象是一个被保存数据和操作这些数据的操作方法的唯一.可标识的集合. 对象可以按类进行分 ...

  5. python web前端

    概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...

  6. Flipboard-BottomSheetlayout 源码分析

    BottomSheetLayout BottomSheet:Google在API 23中已经加入了这样的一个控件. BottomSheet介绍: BottomSheet是一个可以从底部飞入和飞出的An ...

  7. Linux操作系统备份之三:通过二进制拷贝(dd)方式实现Linux操作系统数据的备份

    前面有两篇文章,<Linux操作系统备份之一:使用LVM快照实现Linux操作系统数据的在线备份>和<Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份& ...

  8. LED将为我闪烁:控制发光二极管

      一个完整的linux驱动主要由内部处理和与硬件交互两部分组成.其中内部处理主要是指linux驱动的装载.卸载.与设备文件相关的动作处理以及业务逻辑等:与硬件交互主要是指通过iowrite32.io ...

  9. DEV全选多选小技巧

    var v1 = bindingSourceBase.DataSource as DataTable; foreach (DataRowView v in v1.DefaultView) { v[&q ...

  10. c#-SimHash匹配相似-算法

    使用场景:Google 的 simhash 算法 //通过大量测试,simhash用于比较大文本,比如500字以上效果都还蛮好,距离小于3的基本都是相似,误判率也比较低. //从我的经验,如果我们假定 ...