JDK动态代理

得到代理对象是通过proxy的newproxyinstance方法
image.png
代理对象调用方法时,是会执行InvocationHandler中的invoke方法,所以我们可以实现这个接口并重写invoke方法

jdk代理对象创建流程

  • 定义一个接口及其实现类;
  • 自定义 InvocationHandler 并重写invoke方法,在 invoke 方法中我们会调用原生方法(被代理类的方法)并自定义一些处理逻辑;
  • 通过 Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 方法创建代理对象;

CGLIB动态代理

CGLIB主要是通过Enchancer类的create()方法创建代理对象
MethodInterceptor主要做方法的处理和拦截,此处可以增强被代理类的方法
image.png

  1. /**
  2. *
  3. * @param obj 是生成代理对象,子类
  4. * @param method 被拦截的方法
  5. * @param args 方法的参数集合
  6. * @param proxy 为每个方法都生成一个MethodProxy,用来执行父类方法
  7. * @return
  8. * @throws Throwable
  9. */
  10. @Override
  11. public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
  12. System.out.println("讲课前需要交手机");
  13. /*MethodProxy是cglib为代理对象的每个方法生成的子类方法*/
  14. Object o = proxy.invokeSuper(obj, args);
  15. System.out.println("下课后需要自己复习");
  16. return o;
  17. }

cglib流程

  • 创建目标类
  • 自定义 MethodInterceptor类,重写intercept方法
  • 创建工厂,通过enhancer创建代理对象 ```java import net.sf.cglib.proxy.Enhancer;

public class CglibProxyFactory {

  1. public static Object getProxy(Class<?> clazz) {
  2. // 创建动态代理增强类
  3. Enhancer enhancer = new Enhancer();
  4. // 设置类加载器
  5. enhancer.setClassLoader(clazz.getClassLoader());
  6. // 设置被代理类
  7. enhancer.setSuperclass(clazz);
  8. // 设置方法拦截器
  9. enhancer.setCallback(new DebugMethodInterceptor());
  10. // 创建代理类
  11. return enhancer.create();
  12. }

}

```