Hessian源码学习(2)
来源:互联网 发布:淘宝店被扣48分怎么办 编辑:程序博客网 时间:2024/06/11 16:29
我们在客户端是如何使用hessian呢?
以上代码就可以进行Hessian的远程调用了,但是这些究竟是怎么实现的呢,我们一步步分析(参考源码版本3.0.13)。
factory.create(IHello.class, url);
通过 HessianProxyFactory(Hessian代理工厂)创建一个代理类(采用JDK自带的动态代理),具体代码如下;
helloProxy.sayHello();
实际上是调用代理类HessianProxy的invoke方法,我们具体看下代码:
Java代码
- String url = "http://localhost:8080/Hello/hello";
- HessianProxyFactory factory = new HessianProxyFactory();
- // IHello为调用的服务接口,url为hessian服务url
- IHello helloProxy = (IHello)factory.create(IHello.class, url);
- System.out.println(helloProxy.sayHello());
以上代码就可以进行Hessian的远程调用了,但是这些究竟是怎么实现的呢,我们一步步分析(参考源码版本3.0.13)。
factory.create(IHello.class, url);
通过 HessianProxyFactory(Hessian代理工厂)创建一个代理类(采用JDK自带的动态代理),具体代码如下;
Java代码
- public Object create(Class api, String urlName)
- throws MalformedURLException
- {
- return create(api, urlName, Thread.currentThread().getContextClassLoader());
- }
- public Object create(Class api, String urlName, ClassLoader loader)
- throws MalformedURLException
- {
- URL url = new URL(urlName);
- // HessianProxy implements InvocationHandler
- HessianProxy handler = new HessianProxy(this, url);
- return Proxy.newProxyInstance(api.getClassLoader(),
- new Class[] { api, HessianRemoteObject.class }, handler);
- }
helloProxy.sayHello();
实际上是调用代理类HessianProxy的invoke方法,我们具体看下代码:
Java代码
- // 获取调用的方法名以及方法参数类型
- String methodName = method.getName();
- Class []params = method.getParameterTypes();
- //对于以下方法直接执行本地调用而不是远程调用
- if (methodName.equals("equals") &&
- params.length == 1 && params[0].equals(Object.class)) {
- Object value = args[0];
- if (value == null || ! Proxy.isProxyClass(value.getClass()))
- return new Boolean(false);
- HessianProxy handler = (HessianProxy) Proxy.getInvocationHandler(value);
- return new Boolean(_url.equals(handler.getURL()));
- }
- else if (methodName.equals("hashCode") && params.length == 0)
- return new Integer(_url.hashCode());
- else if (methodName.equals("getHessianType"))
- return proxy.getClass().getInterfaces()[0].getName();
- else if (methodName.equals("getHessianURL"))
- return _url.toString();
- else if (methodName.equals("toString") && params.length == 0)
- return "[HessianProxy " + _url + "]";
- // 判断客户端是否要求支持重载(即客户端是否设置factory.setOverloadEnabled(true);
- //注:3.0.13 只支持参数个数不同的重载,后面版本才真正意义上的支持重载)
- if (! _factory.isOverloadEnabled()) {
- // 不要求重载,则什么都不做
- }
- else if (args != null)
- // 若支持重载,则目标方法名格式为:method名 + "__" + method参数个数
- methodName = methodName + "__" + args.length;
- else
- methodName = methodName + "__0";
- // 执行远程调用(建立http链接,设置一些http header, 序列化方法名和方法参数,执行http请求...)
- conn = sendRequest(methodName, args);
- // 从输入流中读取远程调用结果并返回给客户端
- is = conn.getInputStream();
- AbstractHessianInput in = _factory.getHessianInput(is);
- return in.readReply(method.getReturnType());
0 0
- Hessian源码学习(2)
- Hessian源码学习(1)
- Hessian源码剖析(一)
- Hessian源码剖析(二)
- Hessian源码剖析(三)
- Hessian源码解析(四)
- Hessian源码剖析(七)
- 【Hessian】hessian学习
- Hessian学习总结(一)
- hessian源码,com.caucho.hessian
- hessian源码分析(一)------架构
- Hessian源码分析(二)------ HessianProxy
- Hessian源码分析(三)------ HessianSkeleton
- hessian源码分析(一)------架构
- Hessian源码分析(二)------ HessianProxy
- Hessian源码分析(三)------ HessianSkeleton
- hessian源码分析(一)------架构
- Hessian学习之(二):Hessian集成到Spring
- Step into Scala - 02 - 数据类型
- 在写德州扑克AI的时候想到的一种实现模糊决策的方法
- 数组排序
- 使用typedef语句定义数组类型
- 学习python的一些笔记
- Hessian源码学习(2)
- 二项分布(Python)
- 过滤器应用(四)之权限过滤器
- 用MFC写的OPENCV小程序(1)
- hadoop-0.20.203.0对应的eclipse插件不工作问题解决方案
- iOS autolayout性能问题, uitableview的优化
- 安卓下载保存到本地(二)
- 二叉树的操作实现---数组篇
- 扫盲:这些Mac OS X的快捷键你会用吗?