首先,先说下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来转化。