代理模式作为开发人员来讲,应该不会很陌生,它要做的事情很简单:屏蔽被调用方的实现过程。
它在一类远程过程调用中,使用得非常广泛。具体的过程呢?
调用方 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
今日推荐
周排行