换个新的思路 代替解压jar包 例证:wechat4j 框架中的templateMsg类

很多朋友在写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属性并不可以被子类所调用,因此有些关键信息需要自己去补齐。

结束。

posted @ 2016-05-19 12:41  梁俊鹏  阅读(604)  评论(0编辑  收藏  举报