package cn.hhj.handler; import cn.hhj.request.RpcRequest; import org.springframework.util.StringUtils; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Method; import java.net.Socket; import java.util.Map; public class ProcessorHandler implements Runnable { private Socket socket; private Map handlerMap; public ProcessorHandler(Socket socket, Map handlerMap) { this.socket = socket; this.handlerMap =handlerMap; } @Override public void run() { ObjectInputStream is=null; ObjectOutputStream os=null; try{ is=new ObjectInputStream(socket.getInputStream()); RpcRequest request= (RpcRequest) is.readObject(); Object result=invoke(request); //反射调用本地服务 os=new ObjectOutputStream(socket.getOutputStream()); os.writeObject(result); os.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (os!=null){ os.close(); } } catch (IOException e) { e.printStackTrace(); } } } private Object invoke(RpcRequest request)throws Exception{ String serviceName=request.getClassName(); String version=request.getVersion(); if (!StringUtils.isEmpty(version)){ serviceName+="-"+version; } Object service= handlerMap.get(serviceName); if (service==null){ throw new RuntimeException("service not found"+serviceName); } Object[] params=request.getParameters(); // 参数列表 Method method=null; Class clazz=Class.forName(request.getClassName()); if(params!=null) { Class[] types = new Class[params.length]; // 获得每个参数的类型 for (int i = 0; i < params.length; i++) { types[i] = params[i].getClass(); } method=clazz.getMethod(request.getMethodName(),types); }else{ method=clazz.getMethod(request.getMethodName()); } return method.invoke(service,params); } }