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

目前要解决的是,服务端根据发来的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号   360网站安全检测平台  
00:00 / 00:00
随机播放