神奇的 (a == (Integer) 1 && a == (Integer) 2 && a == (Integer) 3) = true

前一段时间看了一篇文章 (a == (Integer) 1 && a == (Integer) 2 && a == (Integer) 3) 是否可以为 true,当时第一反应怎么可能,谁知道再往下看,作者竟然给出来如下代码,一运行神奇的事出现了,真的为 true,代码如下: package cn.bridgeli.demo; import java.lang.reflect.Field; public class Magic { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { Class cache = Integer.class.getDeclaredClasses()[0]; Field c = cache.getDeclaredField("cache"); c.setAccessible(true); Integer[] array = (Integer[]) c.get(cache); // array[129] is 1 array[130] = array[129]; // Set 2 to be 1 array[131] = array[129]; // Set 3 to be 1 Integer a = 1; if (a == (Integer) 1 && a == (Integer) 2 && a == (Integer) 3) { System.out.println(true); } else { System.out.println(false); } } } 因为作者没有给出解释,所以就研究了一番,发现需要基础非常扎实才能写出这段代码,这段代码之所以为 true,要理解如下几个问题: ...

October 31, 2021 · 2 min · 344 words · Bridge Li

反射的简单应用:解决微信开发中if-else过多的问题

前一段时间,闲着无聊玩微信开发,遇到一个问题:当关注者向公众号发送消息,请求一些服务时,由于是文本消息,所以当公众号拿到消息内容时,必须判断消息以什么打头,即: String content = requestMap.get("Content").trim(); if ("?".equals(content) || "?".equals(content)) { respContent = "您好,我是生活小助手,请根据提示,回复内容选择服务:nn1 回复“天气”获取天气帮助n2 回复“歌曲”获取歌曲帮助n3 回复“公交”获取歌曲帮助n4 回复“火车”获取歌曲帮助"; } else if (content.startsWith("歌曲")) { //TODO } else if (content.startsWith("天气")) { //TODO } else if (content.startsWith("物流")) { //TODO } else if (content.startsWith("公交")) { //TODO } else if (content.startsWith("火车")) { //TODO } else { respContent = "亲,很抱歉,由于功能还不够完善,尚不能处理您回复的信息,请回复“?”显示主菜单,获取帮助,有此给您带来的不便,还请见谅!"; } 来判断何种服务,调用具体的接口来处理,当你的功能越来越完善时,会导致if-else越来越多,多的会自己都搞不清了,另外这个方法也会越来越大,显然不是非常符合面向对象的单一职责原则。那么有没用一个比较好的方法来解决这个问题呢?我曾经的项目经理Zack曾经说过,上天不会这么惩罚一个后期维护代码的人,所以答案是勘定有,今天老夫就给大家带来一个解决方法,需要说明的是:这不是老夫的原创,是老夫研究捷微源码的找到的方法,老夫在捷微方法的基础上做了一些修改,所以先感谢捷微,感谢捷微的开发人员。最后需要说明的是,这个方法也不是很完善,如果有人参考的话,老样子,请做具体修改,但逻辑老夫保证不会有错。 @Override public BaseMessage handleText(String content, String fromUsername, String toUsername) { String respContent = null; BaseMessage baseMessage = null; if ("?".equals(content) || "?".equals(content)) { respContent = "您好,我是生活小助手,请根据提示,回复内容选择服务:nn1 回复“天气”获取天气帮助n2 回复“歌曲”获取歌曲帮助n3 回复“公交”获取公交帮助n4 回复“火车”获取火车帮助"; } else { List<WeixinExpandconfigEntity> weixinExpandconfigEntities = new ArrayList<WeixinExpandconfigEntity>(); boolean isFind = false;// 是否找到关键字信息 for (WeixinExpandconfigEntity weixinExpandconfigEntity : weixinExpandconfigEntities) { // 如果已经找到关键字并处理业务,结束循环。 if (isFind) { break;// 如果找到结束循环 } String[] keys = weixinExpandconfigEntity.getKeyword().split(","); for (String k : keys) { if (content.indexOf(k) != -1) { String className = weixinExpandconfigEntity.getClassname(); String returnType = weixinExpandconfigEntity.getReturnType(); KeyService keyService = null; try { keyService = (KeyService) Class.forName(className).newInstance(); baseMessage = (BaseMessage) Class.forName(returnType).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } keyService.excute(baseMessage, content.substring(2)); isFind = true; break; } } } } if (baseMessage == null) { TextMessage textMessage = new TextMessage(); textMessage.setContent(respContent); baseMessage = textMessage; } baseMessage.setToUserName(fromUsername); baseMessage.setFromUserName(toUsername); baseMessage.setCreateTime(new Date().getTime()); baseMessage.setFuncFlag(0); return baseMessage; }

September 15, 2014 · 1 min · 201 words · Bridge Li