JAVA反射解决switch语句过长问题
首页 > 后端开发    作者:StanWind   2016年9月23日 8:24 星期五   热度:4362°   已自动提交收录  
时间:2016-9-23 8:24   热度:4362° 

目前要解决的是,服务端根据发来的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”原创,转载请保留文章出处。

返回顶部    首页    手机版本    后花园  
版权所有:Make it Better    站长: StanWind    赣ICP备17014296号