动态代理的应用

代理模式作为开发人员来讲,应该不会很陌生,它要做的事情很简单:屏蔽被调用方的实现过程。

它在一类远程过程调用中,使用得非常广泛。具体的过程呢?

调用方 A                                 被调用方B

methodA(){                               getResult(){
   call B.getResult();                       doSomething()。
}                                        }

其实就是A远程调用B的方法。如果不想把远程调用的实现过程放在应用层面上,我只想一个简单的方法调用就行了,具体的实现我暂时不想看到,那么这里可以使用动态代理。

在Java中,动态代理是要实现InvocationHandler接口的,它里面有一个方法叫invoke(),你实现这个方法就可以了。如果不是调用远程方法就直接调用本地方法,如果是远程方法,就走http或者socket请求了,将请求的参数封闭一个对象传递过去就行了,服务器接收参数,根据参数信息调用对应的方法,将结果再传回来就ok了。是不是很简单呢?

invoke()方法在这里像一个拦截器一样,截获方法请求,然后在真正的方法前后可以加入一些逻辑控制,如远程调用封闭HTTP请求,拿回结果等等。AOP我想大家也都听过,AOP的本质上就是动态代理,在方法的前后加上一些日志输出,权限控制等等,只要明白了动态代理的精髓,我想你可以把它运用得如鱼得水。

但是Java的动态代理,它也存在一些不足之处,那就是必须要有接口存在,现在的问题来了,假设没有接口,那么可以使用动态代理么?可以,那就要使用字节码来实现了。拦截到方法后,在方法前后织入一些字节码进入就可以实现逻辑的控制了。

猜你喜欢

转载自gaofulai1988.iteye.com/blog/2265821