Hessian源码学习(一)
【服务端】
HessianServlet 是一个非常普通的Servlet 它直接继承 GenericServlet
我们重点看其中的两个方法:
1.init(ServletConfig config)
这个方法覆写父类的init(ServletConfig config)方法 (我觉得这里覆写init()方法更好)
在初始化中,它做了哪些事情呢?
a.初始化远程服务类(Impl)
if (_homeImpl != null) {}else if (getInitParameter("home-class") != null) {String className = getInitParameter("home-class");Class homeClass = loadClass(className);_homeImpl = homeClass.newInstance();init(_homeImpl);}else if (getInitParameter("service-class") != null) {String className = getInitParameter("service-class");Class homeClass = loadClass(className);_homeImpl = homeClass.newInstance();init(_homeImpl);}private void init(Object service) throws ServletException{if (service instanceof Service) ((Service) service).init(getServletConfig());else if (service instanceof Servlet) ((Servlet) service).init(getServletConfig());}if (_homeAPI != null) { } else if (getInitParameter("home-api") != null) {String className = getInitParameter("home-api");_homeAPI = loadClass(className); } else if (getInitParameter("api-class") != null) {String className = getInitParameter("api-class");_homeAPI = loadClass(className); } else if (_homeImpl != null) {_homeAPI = findRemoteAPI(_homeImpl.getClass());if (_homeAPI == null) _homeAPI = _homeImpl.getClass();}public HessianSkeleton(Object service, Class apiClass){super(apiClass);_service = service;if (! apiClass.isAssignableFrom(service.getClass())) throw new IllegalArgumentException("Service " + service + " must be an instance of " + apiClass.getName());}protected AbstractSkeleton(Class apiClass){_apiClass = apiClass;Method []methodList = apiClass.getMethods();for (int i = 0; i < methodList.length; i++) { Method method = methodList[i]; if (_methodMap.get(method.getName()) == null)_methodMap.put(method.getName(), methodList[i]); Class []param = method.getParameterTypes(); String mangledName = method.getName() + "__" + param.length; _methodMap.put(mangledName, methodList[i]); _methodMap.put(mangleName(method, false), methodList[i]);}}if (! req.getMethod().equals("POST")) {res.setStatus(500, "Hessian Requires POST");PrintWriter out = res.getWriter();res.setContentType("text/html");out.println("<h1>Hessian Requires POST</h1>");return;}Hessian2Input in = new Hessian2Input(is);SerializerFactory serializerFactory = getSerializerFactory();in.setSerializerFactory(serializerFactory);
int code = in.read();if (code != 'c') {throw new IOException("expected 'c' in hessian input at " + code);}out = new HessianOutput(os);out.setSerializerFactory(serializerFactory);
_homeSkeleton.invoke(in, out);
//反序列化输入流获取调用的服务方法String methodName = in.readMethod();Method method = getMethod(methodName);//反序列输入流获取方法参数Class []args = method.getParameterTypes();Object []values = new Object[args.length];for (int i = 0; i < args.length; i++) values[i] = in.readObject(args[i]);// 真正的执行服务方法(java 反射)result = method.invoke(_service, values);//最后把执行写回输出流,输出起始标志:'r' 1 0out.startReply();// 序列化结果out.writeObject(result);// 输出结束标志'z'out.completeReply();1 楼 evanzzy 2011-11-28 支持继续发布Hessian分析类文章。另外lz是否可讲解hessian相关原理和设计思路?谢谢。 2 楼 DiaoCow 2011-11-28 evanzzy 写道支持继续发布Hessian分析类文章。另外lz是否可讲解hessian相关原理和设计思路?谢谢。