一.静态代理
1.定义:静态代理是在程序运行前,代理类的类文件已经存在,并且代理类和委托类的关系在运行前已经确定;
二.动态代理
1.定义:动态代理的代理类是在程序运行时通过反射机制动态创建,不存在代理类的字节码文件。代理类和委托类的关系在程序运行时确定。
动态代理分为JDK动态代理和cglib动态代理。
三.JDK动态代理
1.使用步骤
(1)定义接口和实现类;
(2)实现InvocationHandler接口并重写invoke()方法,在invoke方法中调用被代理类的方法,自定义一些逻辑;
(3)通过newProxyInstance()方法创建代理类的实例对象。
四.cglib动态代理
1.介绍:基于ASM字节码生成库,在运行时对字节码进行修改和动态生成。cglib通过生成被代理类的子类来拦截被代理类的方法,因此不能代理被final修饰的类。
2.使用步骤:
(1)定义一个类;
(2)实现MethodIntercepter接口并重写intercept()方法,intercept()用于拦截增强被代理类的方法,和JDK动态代理中的invoke()方法类似;
(3)通过Enhancer的create()方法创建代理类。
五.JDK动态代理和cglib动态代理的区别
1.JDK动态代理只能代理实现了接口的类或者直接代理接口,cglib可以代理未实现接口的类;
2.JDK动态代理基于反射机制,cglib动态代理使用字节码生成库ASM;
3.JDK动态代理创建代理对象效率高,执行效率低;cglib创建效率低,执行效率高。