jdk、cglib

56 阅读1分钟

JDK 动态代理:

  1. 基于接口: JDK 动态代理是基于接口的代理,目标对象需要实现一个接口,代理对象生成的时候会实现该接口。
  2. Proxy 类和 InvocationHandler 接口: JDK 提供了 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口,通过这两者可以实现动态代理。
  3. 实现 InvocationHandler 接口: 在使用 JDK 动态代理时,需要编写一个实现了 InvocationHandler 接口的类,该类负责处理代理对象上的方法调用。
  4. Proxy.newProxyInstance: 使用 Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 方法创建代理对象,传入类加载器、接口数组和 InvocationHandler 实例。

CGLIB 动态代理:

  1. 基于类: CGLIB 动态代理是基于类的代理,目标对象不需要实现接口,代理对象生成的时候会继承目标对象。
  2. Enhancer 类: CGLIB 提供了 net.sf.cglib.proxy.Enhancer 类,通过该类可以生成一个代理类。
  3. MethodInterceptor 接口: CGLIB 提供了 net.sf.cglib.proxy.MethodInterceptor 接口,类似于 JDK 的 InvocationHandler,用于处理代理对象上的方法调用。
  4. Enhancer.create: 使用 Enhancer.create() 方法创建代理对象,需要设置目标对象的类、回调对象(实现 MethodInterceptor 接口的类)。

综合回答:

可以指出 JDK 动态代理和 CGLIB 动态代理的区别,并根据具体情况选择使用哪一种。JDK 动态代理更适合基于接口的代理,而 CGLIB 动态代理更适合对类的代理。同时,可以强调 JDK 动态代理在 Java 标准库中,无需引入额外的库,而 CGLIB 则需要引入第三方库。