很多朋友在写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属性并不可以被子类所调用,因此有些关键信息需要自己去补齐。
结束。
时间: 2024-10-31 21:37:23