课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java程序员:反射在微信公众平台开发的应用
  • java程序员:反射在微信公众平台开发的应用

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-22

  • 昆明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种了。如果都用分支结构去写,那就有点尴尬了。所以呢,为了解决这种尴尬,下面昆明Java培训机构的老师引入一个概念——反射。

    2、反射

    反射是什么呢?说起这个概念,下面昆明Java培训机构的老师请大家看一个例子。

    2.1一个简单的例子

    publicstaticvoid       

    Demo demo=new Demo();

    }

    2.2实例化Class类对象

    Class<?> demo1=null;

    demo1=Class.forName("com.example.bean.Demo");

    注意:还有很多示例,请移驾到baidu.com

    在你百度了一下你就会发现,昆明Java培训机构的老师的两个简单的例子网上也是有的。不过还是要总结一下反射有什么用:

    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;

    }

    接入成功了之后了,下面就到了重点了,昆明Java培训机构的老师直接上代码:

    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了。

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:PHP和Java中foreach循环的用法区别

下一篇:java培训:REST WebService与SOAP WebService的比较

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:12/29

Java--零基础业余班

Java--零基础业余班

开班日期:12/29

Java--周末提升班

Java--周末提升班

开班日期:12/29

Java--零基础周末班

Java--零基础周末班

开班日期:12/29

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56