这段时间上班还算空闲,就想研究下其他东西,想来想去,都知道研究什么好,就研究下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来转化。
今天,先写到这里,改天看完有新的体会在继续写。
首先,先说下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来转化。
今天,先写到这里,改天看完有新的体会在继续写。