反射在微信公眾平台開發的應用,反射信公眾平台
1、開發背景
在微信公眾號開發的時候,我們都會去解析微信消息,然後根據不同的消息類型做對應的操作。下面是一段微信的消息體:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[MsgType]]></MsgType>
<MsgId>1234567890123456</MsgId>
</xml>
這裡的MsgType有8種,分別是text、event。這麼多中消息類型,怎麼辦呢?if...else,switch?都可以處理,看起來It's too simple。
那麼問題來了,還有事件消息event。這個消息有關注,取關,上傳地理位置以及自定義菜單等。看消息體:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>
事件消息都是event類型,具體的事件(點擊了不同的按鈕)對應一個Event,在自定義菜單的時候,那這個Event就有N種了。如果都用分支結構去寫,那就有點尴尬了。所以呢,為了解決這種尴尬,下面引入一個概念——反射。
2、反射
反射是什麼呢?說起這個概念,筆者表示一臉懵逼。我不記得,下面請看一幾個例子。
2.1一個簡單的例子
publicstaticvoid
Demo demo=new Demo();
}
2.2實例化Class類對象
Class<?> demo1=null;
demo1=Class.forName("com.example.bean.Demo");
注意: 還有很多示例,請移駕到baidu.com
在你百度了一下你就會發現,我的兩個簡單的例子也是copy過來的。不過還是要總結一下反射有什麼用:
3、反射在微信公眾平台開發中的應用
public interface WechatEventCenter {
/**
* @功能描述: 微信默認回復
*/
public BaseWechatMsg defaultEvent();
/**
* @功能描述: 文本消息
*/
public BaseWechatMsg text();
/**
* @功能描述: 位置消息
*/
public BaseWechatMsg location();
/**
* @功能描述: 語音消息
*/
public BaseWechatMsg voice();
/**
* @功能描述: <p>事件消息</p>
*/
public BaseWechatMsg event();
/**
* @功能描述: <p>用戶未關注時,進行關注後的事件推送</p>
* @return
*/
public BaseWechatMsg subscribe();
/**
* @功能描述: 按鈕1, 創建按鈕時對應的EventKey為方法名
* 所以這裡的方法名看著有點怪啊,沒有按java的命名規范來,你也可以按照自己的喜好來定義
*/
public BaseWechatMsg EVENT_HOME();
}
@RequestMapping(value="index")
@ResponseBody
public String wechat(HttpServletRequest request, HttpServletResponse response, String signature, String timestamp, String nonce, String echostr) {
String result = "";
String method = request.getMethod();
if("GET".equals(method)){//接入驗證
return echostr;//直接返回echostr便接入成功了,此處省略了解密驗證
} else {//消息處理
result = dopost(request);
}
return result;
}
接入成功了之後了,下面就到了重點了,直接上代碼:
private String dopost(HttpServletRequest request){
BaseWechatMsg wechatMsg;
try {
String sReqData = WechatUtils.convertStreamToString(request.getInputStream());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(sReqData);
InputSource is = new InputSource(sr);
Document document = db.parse(is);
Element root = document.getDocumentElement();
String FromUserName = root.getElementsByTagName(HqWechatConstant.FromUserName).item(0).getTextContent();
System.out.println("用戶: "+FromUserName+" 進入wechat. ");
System.out.println("用戶消息為:\r\n" + sReqData);
String msgType = root.getElementsByTagName(HqWechatConstant.MsgType).item(0).getTextContent();
wechatEventCenter.setRoot(root);//參數注入
Method method = wechatEventCenter.getClass().getMethod(msgType);//根據方法名綁定方法
wechatMsg = (BaseWechatMsg) method.invoke(wechatEventCenter);
} catch (Exception e) {
//調用默認方法
wechatMsg = (BaseWechatMsg) wechatEventCenter.defaultEvent();
e.printStackTrace();
} finally {
}
System.out.println("回復消息為:\r\n"+wechatMsg);
return wechatMsg.toString();
}
這裡的處理就用到了反射了,就是下面這兩行代碼:
Method method = wechatEventCenter.getClass().getMethod(msgType);
wechatMsg = (BaseWechatMsg) method.invoke(wechatEventCenter);
這樣整個過程就完成了,在處理事件消息的時候也是一樣的根據事件的EventKey去調用對應的方法就OK了,這裡就不贅述了。
4、總結
沒啥好總結的
僅供參考,不足之處還請見諒,歡迎指正!轉載請標明出處。如有疑問,歡迎評論或者聯系我郵箱
[email protected]