JDK动态代理
得到代理对象是通过proxy的newproxyinstance方法
代理对象调用方法时,是会执行InvocationHandler中的invoke方法,所以我们可以实现这个接口并重写invoke方法
jdk代理对象创建流程
- 定义一个接口及其实现类;
- 自定义
InvocationHandler
并重写invoke
方法,在invoke
方法中我们会调用原生方法(被代理类的方法)并自定义一些处理逻辑; - 通过
Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
方法创建代理对象;
CGLIB动态代理
CGLIB主要是通过Enchancer类的create()方法创建代理对象
MethodInterceptor主要做方法的处理和拦截,此处可以增强被代理类的方法
/**
*
* @param obj 是生成代理对象,子类
* @param method 被拦截的方法
* @param args 方法的参数集合
* @param proxy 为每个方法都生成一个MethodProxy,用来执行父类方法
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("讲课前需要交手机");
/*MethodProxy是cglib为代理对象的每个方法生成的子类方法*/
Object o = proxy.invokeSuper(obj, args);
System.out.println("下课后需要自己复习");
return o;
}
cglib流程
- 创建目标类
- 自定义 MethodInterceptor类,重写intercept方法
- 创建工厂,通过enhancer创建代理对象 ```java import net.sf.cglib.proxy.Enhancer;
public class CglibProxyFactory {
public static Object getProxy(Class<?> clazz) {
// 创建动态代理增强类
Enhancer enhancer = new Enhancer();
// 设置类加载器
enhancer.setClassLoader(clazz.getClassLoader());
// 设置被代理类
enhancer.setSuperclass(clazz);
// 设置方法拦截器
enhancer.setCallback(new DebugMethodInterceptor());
// 创建代理类
return enhancer.create();
}
}
```