JDK动态代理代理——Hessian实现原理

代理理解:就是在目标对象之上添加额外处理,使功能增强或减少。代理对象本省不一定要有目标对象本身。目标对象不一定就一定包含在代理对象中(组合模式),他可以通过网络或者。

RPC实现中的几个实例产品,例如Hessian,可以看做是代理的重要代表。其客户端的主要实现原理就是利用了JDK提供的动态代理机制。其客户端代理对象,主要用于接收当前client的方法。然后将方法名称、参数、以及interface_name 传递给服务器,服务器利用反射调用目标对象,将返回结果写回到输出流中。然后客户端将服务器端的返回结果,进行解析。主要使用到的几个重要的类。

Proxy\InvocationHandler\.

 

JDK动态代理理解:

动态代理对象是虚拟机构造出来的。并且代理对象是一个或者多个接口的实现,不会继承任何类,也就是说只能将代理对象转换成上述接口的对象实例。如果没有接口是不可以的。这是JDK动态代理的弊端。代理对象将所有的目标接口的处理方法都交给了InvocationHandler。也就是说,InvocationHandler对象才是决定是否调用或怎么调用目标对象的决策者。

例如,Hessian中的默认实现中,就是将InvocationHandler的invoke方法的method、args通过HttpConnection传递给服务器,进行调用,服务器(默认)通过反射调用目标对象,然后再通过这个HttpConnection将结果返回给Client Side.注意:由于走的是HTTP连接,所以可以携带请求头,在服务器端进行校验,进行安全验证;调用一次方法就会创建一个连接,必定会伴随连个过程(发送数据流/接收数据流)。这是通过网络调用目标对象。当然也可以直接在InvocationHandler的构造函数里面传入目标对象,直接在invoke方法里面调用目标对象的方法,当然需要method.invoke(target,args)之前或者之后,进行AOP处理。但是这里目标对象。

针对Hessian的几点重要说明:

1、如果Hessian返回的是一个复杂对象的话,那么该对象需要实现serializiable接口。否则不能被序列化。因为是通过网络传输二进制流

2、返回的值可以为string\int\double\integer\list\map\POJO\对象

Tulips

你可能感兴趣的:(JDK动态代理代理——Hessian实现原理)