程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 反射在微信公眾平台開發的應用,反射信公眾平台

反射在微信公眾平台開發的應用,反射信公眾平台

編輯:JAVA綜合教程

反射在微信公眾平台開發的應用,反射信公眾平台


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]  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved