很多朋友在写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. Javascript定时器(一)——单线程

    一.JavaScript 引擎是单线程的 可以从下面的代码中看到,第一个用setTimeout中的代码是死循环,由于是单线程,下面的两个定时器就没机会执行了. <script type=&quo ...

  2. Xcode5 取消ARC

    终于开心的装上Xcode5,主管马上发布新的任务,开始新的项目,各种开心,终于可以换个界面看看了. 可是谁知第一步创建项目就开始悲剧了,居然没有地方可以选择非ARC了,真是肿么个情况呀,查了一下,万能 ...

  3. 横屏下的ImagePickerController

    Try this way.... As per Apple Document, ImagePicker Controller never Rotate in Landscape mode. You h ...

  4. Java中的面向接口编程

    面向接口编程是很多软件架构设计理论都倡导的编程方式,学习Java自然少不了这一部分,下面是我在学习过程中整理出来的关于如何在Java中实现面向接口编程的知识.分享出来,有不对之处还请大家指正. 接口体 ...

  5. C# 常用接口学习 ICollection&lt;T&gt;

    C# 常用接口学习 ICollection<T> 作者:乌龙哈里 时间:2015-11-01 平台:Window7 64bit,Visual Studio Community 2015 参 ...

  6. usb设备驱动的分析

    怎样来分析驱动程序呢? 1.将一个usb设备插入到电脑上,在串口软件上能够显示一些打印信息,用source insight软件打开linux内核2.6.22版本,然后从第一行查找通用的关键字,找到这一 ...

  7. Java 多线程 并发和并行

    并发和并行都可以表示执行多个任务,但是偏重点不同.并发偏重于多个任务交替执行,而多个任务之间有可能是串行的.并行是真正意义上的同时执行. 并发和并行示意图如下: 从严格意义上来说,并行的多个任务是真实 ...

  8. 潭州课堂25班:Ph201805201 WEB 之 CSS 第二课 (课堂笔记)

    CSS 的引入方法: 第一种 : <!--直接在标签仙设置--><p style="color: yellow">CSS的第一种引入方法</p> ...

  9. Linux下tar.gz 安装

    将安装文件拷贝至你的目录中 如果是以root身份登录上的,就将软件拷贝至/root中. cp xxx.tar.gz /root 解压缩包 tar xvzf xxx.tar.gz 切换到安装目录下 cd ...

  10. 2017阿里C++研发工程师-校招-单词匹配

    题目描述 给一个字符串, 然后给一个字典. 把字符串分解成字典里的单词组成的句子, 请输出所需空格最少的方案.并输出该方案. 样例 例如: 字符串为: str="ilikealibaba&q ...