commons proxy--jdk、cglib实现动态代理的异同

这段时间上班还算空闲,就想研究下其他东西,想来想去,都知道研究什么好,就研究下commons组件吧,以前有看过下,但没细。今天开始看下commons-proxy组件,有点心得,发表下和大家分享,不正确之处请指正。
首先,先说下jdk和cglib实现动态代理的相异之处。
一、所代理的目标。
jdk所代理的是接口,通过Proxy.newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)方法可以创建代理对象,其中loader用来加载代理对象,interfaces是所有要代理的接口,InvocationHandler是我们要实现的处理接口。jdk不能代理对象。
cglib所代理的是对象,通过Enhancer enhancer = new Enhancer();
...
enhancer.create();创建代理对象。
二、处理接口不同。
jdk的处理接口是java.lang.reflect.InvocationHandler,调用代理对象的方法会调用处理接口的invoke(Object proxy, Method method, Object[] args)方法。
cglib的处理接口是net.sf.cglib.proxy.InvocationHandler、net.sf.cglib.proxy.MethodInterceptor、net.sf.cglib.proxy.Dispatcher,调用代理对象的方法会调用处理接口InvocationHandler的invoke(Object proxy, Method method, Object[] args)方法、MethodInterceptor的intercept( Object object, Method method, Object[] args, MethodProxy methodProxy )或Dispatcher的loadObject()方法。你根据需要实现其中一个接口。
Commons-proxy组件里实现了三种动态代理技术方法(jdk、cglib和javassist)的统一接口,创建三种类型的代理,interceptor、invoker、delegator,分别通过三个处理接口org.apache.commons.proxy.Interceptor、org.apache.commons.proxy.Invoker、org.apache.commons.proxy.ObjectProvider来统一。
由于cglib也提供类似的接口,所有其转化比较容易,在此不介绍。Jdk的InvocationHandler接口的invoke(Object proxy, Method method, Object[] args)方法要分别转化为三个相应的接口。
转化为Interceptor接口。
通过ProxyFactory的内部类InterceptorInvocationHandler来转化。
转化为Invoker接口。
通过ProxyFactory的内部类InvokerInvocationHandler来转化。
转化为ObjectProvider接口。
通过ProxyFactory的内部类DelegatorInvocationHandler来转化。

今天,先写到这里,改天看完有新的体会在继续写。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值