JAVA反射解决switch语句过长问题
目前要解决的是,服务端根据发来的command进行指定的操作
按照以前的有switch代码快400行 现在几行
@Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { Request request = (Request) e.getMessage(); short cmd = request.getCmd(); if(cmd!=CMD_SECURE) ServerLog.getLogger().debug(String.format("cmd---->0x%H" , cmd)); //反射调用处理方法 CommandReflect.handle(cmd, ctx, request); }
CommandReflect.java
public class CommandReflect implements ServerSetting{ private static Map<Short, String> reflect; static { int c = 0; reflect = new HashMap<Short, String>(); Field[] fields = Command.class.getFields(); for(Field f:fields){ try { String name = f.getName(); Short value = f.getShort(f.getName()); ServerLog.getLogger().debug("CMD Init---->"+ name); name = HANDLER+"."+(name.split("_"))[1]; c++; reflect.put(value, name); ServerLog.getLogger().debug("Package---->"+ name); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } ServerLog.getLogger().info("初始化" + c + "条命令完毕"); } /** * 通过反射执行处理类 */ public static void handle(Short cmd,ChannelHandlerContext ctx,Request request){ String className = reflect.get(cmd); try { @SuppressWarnings("unchecked") Class<Handler> classtype = (Class<Handler>) Class.forName(className); Handler h = classtype.newInstance(); h.setCtx(ctx); h.setRequest(request); h.handle(); } catch (ClassNotFoundException e) { //e.printStackTrace(); ServerLog.getLogger().info("找不到处理类["+String.format("0x%H", cmd)+"]"); }catch(Exception e){ ServerLog.getLogger().info("处理对象出错["+String.format("0x%H", cmd)+"]"); e.printStackTrace(); } } }
在这里得到Handler基础类 并且执行统一的handle方法
我的command的名字和值对应着继承类的命名规律
常量的名字和我的类名一样 这样放到map里就能很快找到了
然后我的Handler.java
/** * 分发处理基类 * @author StanWind * */ public abstract class Handler implements Command{ protected ChannelHandlerContext ctx; protected Request request; public ChannelHandlerContext getCtx() { return ctx; } public void setCtx(ChannelHandlerContext ctx) { this.ctx = ctx; } public Request getRequest() { return request; } public void setRequest(Request request) { this.request = request; } /** * 分发处理方法 */ public abstract void handle(); }
自己记录下 写的不是很清除
本文作者:StanWind
文章标题: JAVA反射解决switch语句过长问题
本文地址:https://www.stanwind.com/post/8
版权声明:若无注明,本文皆为“Make it Better”原创,转载请保留文章出处。
本文地址:https://www.stanwind.com/post/8
版权声明:若无注明,本文皆为“Make it Better”原创,转载请保留文章出处。
相关文章