JDK 动态代理:
- 基于接口: JDK 动态代理是基于接口的代理,目标对象需要实现一个接口,代理对象生成的时候会实现该接口。
- Proxy 类和 InvocationHandler 接口: JDK 提供了
java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口,通过这两者可以实现动态代理。 - 实现 InvocationHandler 接口: 在使用 JDK 动态代理时,需要编写一个实现了
InvocationHandler接口的类,该类负责处理代理对象上的方法调用。 - Proxy.newProxyInstance: 使用
Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法创建代理对象,传入类加载器、接口数组和InvocationHandler实例。
CGLIB 动态代理:
- 基于类: CGLIB 动态代理是基于类的代理,目标对象不需要实现接口,代理对象生成的时候会继承目标对象。
- Enhancer 类: CGLIB 提供了
net.sf.cglib.proxy.Enhancer类,通过该类可以生成一个代理类。 - MethodInterceptor 接口: CGLIB 提供了
net.sf.cglib.proxy.MethodInterceptor接口,类似于 JDK 的InvocationHandler,用于处理代理对象上的方法调用。 - Enhancer.create: 使用
Enhancer.create()方法创建代理对象,需要设置目标对象的类、回调对象(实现MethodInterceptor接口的类)。
综合回答:
可以指出 JDK 动态代理和 CGLIB 动态代理的区别,并根据具体情况选择使用哪一种。JDK 动态代理更适合基于接口的代理,而 CGLIB 动态代理更适合对类的代理。同时,可以强调 JDK 动态代理在 Java 标准库中,无需引入额外的库,而 CGLIB 则需要引入第三方库。