今天闲来无事,研究了一下JDK动态代理和CgLib,现总结如下:
一、JDK动态代理机制
JDK主要会做以下工作:
我们查看底层代码实现获悉如下
1、获取target object上所有的接口列表
2、确定要生成的代理类的类名,默认为:com.sun.proxy.$ProxyXXXX
3、根据需要实现的接口信息,在代码中动态创建该Proxy类的字节码
4、将对应的字节码转换为对应的class对象
5、创建InvocationHandler实例handler,用来拦截处理Proxy所有方法的调用
6、Proxy的class对象以创建的handler对象为参数,实例化一个proxy对象。
JDK通过 java.lang.reflect.Proxy包来支持动态代理,一般情况下,我们使用下面的newProxyInstance方法,在调用代理对象中的每一个方法时,在代码内部,都是直接调用了InvocationHandler 的invoke方法,而invoke方法根据代理类传递给自己的method参数来区分是什么方法
HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(
ProxyTest.class.getClassLoader(),
new Class[]{HelloWorld.class},
handler);
二、CgLib机制
JDK中提供的生成动态代理类的机制有个鲜明的特点是:某个类必须有实现的接口,而
生成的代理类也只能代理某个类接口定义的方法。这个时候CgLib来了,机制如下
1、查找target object上所有非final的public类型的方法定义(通过Enhancer创建动态代理)
2、将这些方法的定义转换成字节码
3、将组成的字节码转换为响应的代理的class对象(Enhancer.setCallback插入method interceptor)
4、实现MethodInterceptor接口,用来处理对代理(必须实现intercept方法)
完美解决JDK动态代理的这个问题。