Make it Better
JAVA反射解决switch语句过长问题
2016-9-23 StanWind


目前要解决的是,服务端根据发来的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();

}





自己记录下 写的不是很清除






















发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容