Hessian源码分析--HessianProxyFactory
HessianProxyFactory是HessianProxy的工厂类,其通过HessianProxy来生成代理类。
如下面代码:
HessianProxyFactory factory = new HessianProxyFactory();
HelloService helloService = (HelloService) factory.create(HelloService.class, url);
System.out.println(helloService.helloWorld("jimmy"));
HessianProxyFactory的create函数如下:
public Object create(Class api, String urlName)
throws MalformedURLException
{
return create(api, urlName, _loader);
}
public Object create(Class<?> api, String urlName, ClassLoader loader)
throws MalformedURLException
{
URL url = new URL(urlName);
return create(api, url, loader);
}
create函数的最终实现是:
public Object create(Class<?> api, URL url, ClassLoader loader)
{
if (api == null)
throw new NullPointerException("api must not be null for HessianProxyFactory.create()");
InvocationHandler handler = null;
handler = new HessianProxy(url, this, api);
return Proxy.newProxyInstance(loader,
new Class[] { api,
HessianRemoteObject.class },
handler);
}
由上面代码段我们可以看到,HessianProxyFactory的create函数最终是创建了一个HessianProxy代理类的目标类。
HessianProxyFactory的作用就是通过代理类HessianProxy来生成目标类。
HessianProxyFactory源码如下:
public class HessianProxyFactory implements ServiceProxyFactory, ObjectFactory {
protected static Logger log
= Logger.getLogger(HessianProxyFactory.class.getName());
private final ClassLoader _loader;
private SerializerFactory _serializerFactory;
private HessianConnectionFactory _connFactory;
private HessianRemoteResolver _resolver;
private String _user;
private String _password;
private String _basicAuth;
private boolean _isOverloadEnabled = false;
private boolean _isHessian2Reply = true;
private boolean _isHessian2Request = false;
private boolean _isChunkedPost = true;
private boolean _isDebug = false;
private long _readTimeout = -1;
private long _connectTimeout = -1;
public HessianProxyFactory()
{
this(Thread.currentThread().getContextClassLoader());
}
public HessianProxyFactory(ClassLoader loader)
{
_loader = loader;
_resolver = new HessianProxyResolver(this);
}
public void setUser(String user)
{
_user = user;
_basicAuth = null;
}
public void setPassword(String password)
{
_password = password;
_basicAuth = null;
}
public String getBasicAuth()
{
if (_basicAuth != null)
return _basicAuth;
else if (_user != null && _password != null)
return "Basic " + base64(_user + ":" + _password);
else
return null;
}
public void setConnectionFactory(HessianConnectionFactory factory)
{
_connFactory = factory;
}
public HessianConnectionFactory getConnectionFactory()
{
if (_connFactory == null) {
_connFactory = createHessianConnectionFactory();
_connFactory.setHessianProxyFactory(this);
}
return _connFactory;
}
public void setDebug(boolean isDebug)
{
_isDebug = isDebug;
}
public boolean isDebug()
{
return _isDebug;
}
/**
* Returns true if overloaded methods are allowed (using mangling)
*/
public boolean isOverloadEnabled()
{
return _isOverloadEnabled;
}
/**
* set true if overloaded methods are allowed (using mangling)
*/
public void setOverloadEnabled(boolean isOverloadEnabled)
{
_isOverloadEnabled = isOverloadEnabled;
}
/**
* Set true if should use chunked encoding on the request.
*/
public void setChunkedPost(boolean isChunked)
{
_isChunkedPost = isChunked;
}
/**
* Set true if should use chunked encoding on the request.
*/
public boolean isChunkedPost()
{
return _isChunkedPost;
}
/**
* The socket timeout on requests in milliseconds.
*/
public long getReadTimeout()
{
return _readTimeout;
}
/**
* The socket timeout on requests in milliseconds.
*/
public void setReadTimeout(long timeout)
{
_readTimeout = timeout;
}
/**
* The socket connection timeout in milliseconds.
*/
public long getConnectTimeout()
{
return _connectTimeout;
}
/**
* The socket connect timeout in milliseconds.
*/
public void setConnectTimeout(long timeout)
{
_connectTimeout = timeout;
}
/**
* True if the proxy can read Hessian 2 responses.
*/
public void setHessian2Reply(boolean isHessian2)
{
_isHessian2Reply = isHessian2;
}
/**
* True if the proxy should send Hessian 2 requests.
*/
public void setHessian2Request(boolean isHessian2)
{
_isHessian2Request = isHessian2;
if (isHessian2)
_isHessian2Reply = true;
}
/**
* Returns the remote resolver.
*/
public HessianRemoteResolver getRemoteResolver()
{
return _resolver;
}
/**
* Sets the serializer factory.
*/
public void setSerializerFactory(SerializerFactory factory)
{
_serializerFactory = factory;
}
/**
* Gets the serializer factory.
*/
public SerializerFactory getSerializerFactory()
{
if (_serializerFactory == null)
_serializerFactory = new SerializerFactory(_loader);
return _serializerFactory;
}
protected HessianConnectionFactory createHessianConnectionFactory()
{
String className
= System.getProperty(HessianConnectionFactory.class.getName());
HessianConnectionFactory factory = null;
try {
if (className != null) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class<?> cl = Class.forName(className, false, loader);
factory = (HessianConnectionFactory) cl.newInstance();
return factory;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return new HessianURLConnectionFactory();
}
public Object create(String url)
throws MalformedURLException, ClassNotFoundException
{
HessianMetaInfoAPI metaInfo;
metaInfo = (HessianMetaInfoAPI) create(HessianMetaInfoAPI.class, url);
String apiClassName =
(String) metaInfo._hessian_getAttribute("java.api.class");
if (apiClassName == null)
throw new HessianRuntimeException(url + " has an unknown api.");
Class<?> apiClass = Class.forName(apiClassName, false, _loader);
return create(apiClass, url);
}
public Object create(Class api, String urlName)
throws MalformedURLException
{
return create(api, urlName, _loader);
}
public Object create(Class<?> api, String urlName, ClassLoader loader)
throws MalformedURLException
{
URL url = new URL(urlName);
return create(api, url, loader);
}
public Object create(Class<?> api, URL url, ClassLoader loader)
{
if (api == null)
throw new NullPointerException("api must not be null for HessianProxyFactory.create()");
InvocationHandler handler = null;
handler = new HessianProxy(url, this, api);
return Proxy.newProxyInstance(loader,
new Class[] { api,
HessianRemoteObject.class },
handler);
}
public AbstractHessianInput getHessianInput(InputStream is)
{
return getHessian2Input(is);
}
public AbstractHessianInput getHessian1Input(InputStream is)
{
AbstractHessianInput in;
if (_isDebug)
is = new HessianDebugInputStream(is, new PrintWriter(System.out));
in = new HessianInput(is);
in.setRemoteResolver(getRemoteResolver());
in.setSerializerFactory(getSerializerFactory());
return in;
}
public AbstractHessianInput getHessian2Input(InputStream is)
{
AbstractHessianInput in;
if (_isDebug)
is = new HessianDebugInputStream(is, new PrintWriter(System.out));
in = new Hessian2Input(is);
in.setRemoteResolver(getRemoteResolver());
in.setSerializerFactory(getSerializerFactory());
return in;
}
public AbstractHessianOutput getHessianOutput(OutputStream os)
{
AbstractHessianOutput out;
if (_isHessian2Request)
out = new Hessian2Output(os);
else {
HessianOutput out1 = new HessianOutput(os);
out = out1;
if (_isHessian2Reply)
out1.setVersion(2);
}
out.setSerializerFactory(getSerializerFactory());
return out;
}
public Object getObjectInstance(Object obj, Name name,
Context nameCtx, Hashtable<?,?> environment)
throws Exception
{
Reference ref = (Reference) obj;
String api = null;
String url = null;
for (int i = 0; i < ref.size(); i++) {
RefAddr addr = ref.get(i);
String type = addr.getType();
String value = (String) addr.getContent();
if (type.equals("type"))
api = value;
else if (type.equals("url"))
url = value;
else if (type.equals("user"))
setUser(value);
else if (type.equals("password"))
setPassword(value);
}
if (url == null)
throw new NamingException("`url' must be configured for HessianProxyFactory.");
// XXX: could use meta protocol to grab this
if (api == null)
throw new NamingException("`type' must be configured for HessianProxyFactory.");
Class apiClass = Class.forName(api, false, _loader);
return create(apiClass, url);
}
private String base64(String value)
{
StringBuffer cb = new StringBuffer();
int i = 0;
for (i = 0; i + 2 < value.length(); i += 3) {
long chunk = (int) value.charAt(i);
chunk = (chunk << 8) + (int) value.charAt(i + 1);
chunk = (chunk << 8) + (int) value.charAt(i + 2);
cb.append(encode(chunk >> 18));
cb.append(encode(chunk >> 12));
cb.append(encode(chunk >> 6));
cb.append(encode(chunk));
}
if (i + 1 < value.length()) {
long chunk = (int) value.charAt(i);
chunk = (chunk << 8) + (int) value.charAt(i + 1);
chunk <<= 8;
cb.append(encode(chunk >> 18));
cb.append(encode(chunk >> 12));
cb.append(encode(chunk >> 6));
cb.append('=');
}
else if (i < value.length()) {
long chunk = (int) value.charAt(i);
chunk <<= 16;
cb.append(encode(chunk >> 18));
cb.append(encode(chunk >> 12));
cb.append('=');
cb.append('=');
}
return cb.toString();
}
public static char encode(long d)
{
d &= 0x3f;
if (d < 26)
return (char) (d + 'A');
else if (d < 52)
return (char) (d + 'a' - 26);
else if (d < 62)
return (char) (d + '0' - 52);
else if (d == 62)
return '+';
else
return '/';
}
}
Hessian源码分析--HessianProxyFactory的更多相关文章
- Hessian源码分析--HessianProxy
在上一篇博客 Hessian源码分析--HessianProxyFactory 中我们了解到,客户端获得的对象其实是HessianProxy生成的目标对象,当调用目标对象的方法时,会调用Hessian ...
- Hessian源码分析--HessianSkeleton
HessianSkeleton是Hessian的服务端的核心,简单总结来说:HessianSkeleton根据客户端请求的链接,获取到需要执行的接口及实现类,对客户端发送过来的二进制数据进行反序列化, ...
- Hessian源码分析--总体架构
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二进制协 ...
- (转)hessian源码分析(一)------架构
在计费中心的对外交互这块采用了hessian,有必要对hessian的运行机理和源码做一定的解析. 大致翻了翻源码后,发现hessian的主要结构分客户端与服务端,中间基于http传输.客户端主要做的 ...
- Hessian源码分析--HessianServlet
Hessian可以通过Servlet来对外暴露服务,HessianServlet继承于HttpServlet,但这仅仅是一个外壳,使用web服务器来提供对外的Http请求,在web.xml中我们会进行 ...
- SURF算法与源码分析、下
上一篇文章 SURF算法与源码分析.上 中主要分析的是SURF特征点定位的算法原理与相关OpenCV中的源码分析,这篇文章接着上篇文章对已经定位到的SURF特征点进行特征描述.这一步至关重要,这是SU ...
- Dubbo 源码分析 - 服务引用
1. 简介 在上一篇文章中,我详细的分析了服务导出的原理.本篇文章我们趁热打铁,继续分析服务引用的原理.在 Dubbo 中,我们可以通过两种方式引用远程服务.第一种是使用服务直联的方式引用服务,第二种 ...
- 【OpenCV】SIFT原理与源码分析:关键点搜索与定位
<SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 由前一步<DoG尺度空间构造>,我们得到了 ...
- 12.源码分析—如何为SOFARPC写一个序列化?
SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...
随机推荐
- 数据库的事务、ACID及隔离级别
事务 所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么不做,是一个不可分割的工作单位.例如,在关系数据库中,一条或一组SQL语句.整个程序都可以是一个事务. 事务和程序是两个概念,一个程 ...
- js打印小结
<script type="text/javascript"> //打印必备参数 var hkey_root,hkey_path,hkey_key; hkey_root ...
- linux修改root账户的用户名所得的教训
之前linux服务器的密码被别人改过, 然后叫服务器相关的负责人重置了root账户(服务器负责人在客户所在公司), 重置好之后, 领导叫更改下root 用户名和密码, 于是我二话不说就开始找方法, 找 ...
- Ubuntu14.04安装 HP DeskJet GT 5820 打印机的方法
原创内容发表在 http://www.linuxdiyf.com/linux/25331.html 步骤就是: 这里(https://sourceforge.net/projects/hplip/fi ...
- pycharm 安装与基本设置
一.下载及安装 打开官网下载:https://www.jetbrains.com/pycharm/download/#section=windows 下载完毕之后可直接双击可执行文件,然后点击&quo ...
- 背包DP入门小笔记01背包
FJUT OJ 2347 http://59.77.139.92/Problem.jsp?pid=2347 采药 TimeLimit:1000MS MemoryLimit:128MB 64-bit ...
- matlab sparse函数和full函数用法详解(转)
sparse函数 功能:Create sparse matrix-创建稀疏矩阵 用法1:S=sparse(X)--将矩阵X转化为稀疏矩阵的形式,即矩阵X中任何零元素去除,非零元素及其下标(索引)组成矩 ...
- R语言中函数调试
有时候会用R语言写一下简单的脚本处理函数,加入需要调试的话可以按照下面的步骤进行: fun <- function(x , y){ x + y x - y x * y x / y } debug ...
- Go 语言结构
Go Hello World 实例 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释 接下来让我们来看下简单的代码,该代码输出了"Hello ...
- Mac小技巧:强制退出程序的六种方法
原帖地址: http://www.cnbeta.com/articles/175447.htm 1.使用键盘快捷键强制退出处于活跃状态的Mac程序 快捷键:Command+Option+Shift+E ...