南京制作网站公司,企业网站可以做商城类,我的网站模板下载不了,商户如何做h5商城网站是什么意思JDK 动态代理和 CGLIB 动态代理的区别
JDK 动态代理和 CGLIB 动态代理都是在 Java 中实现动态代理的两种常见方式。它们各自有不同的特点和适用场景。下面详细介绍一下这两种动态代理的区别#xff1a;
1. 代理机制
JDK 动态代理:
实现原理: JDK 动态代理基于 Java 的反射…JDK 动态代理和 CGLIB 动态代理的区别
JDK 动态代理和 CGLIB 动态代理都是在 Java 中实现动态代理的两种常见方式。它们各自有不同的特点和适用场景。下面详细介绍一下这两种动态代理的区别
1. 代理机制
JDK 动态代理:
实现原理: JDK 动态代理基于 Java 的反射机制通过反射创建一个代理对象该代理对象实现与目标对象相同的接口。
接口要求: 要求被代理的对象必须实现至少一个接口。
应用场景: 适用于那些基于接口定义的行为代理。
CGLIB 动态代理:
实现原理: CGLIB 是一个高性能的代码生成库它使用字节码技术生成代理类。CGLIB 创建的代理类不是目标类的子类而是通过继承一个代理类来实现代理功能。
接口要求: 不要求被代理的对象实现接口可以代理任何类。
应用场景: 适用于那些没有提供接口的目标对象或者需要代理所有方法包括 final 方法的场景。
2. 代理对象
JDK 动态代理:
生成的代理对象是目标对象所实现接口的实现类。
代理对象可以调用目标对象未实现的方法。
CGLIB 动态代理:
生成的代理对象是目标对象的子类。
代理对象不能调用目标对象的 final 和 private 方法因为这些方法在子类中不可见。
3. 生成代理对象的方式
JDK 动态代理:
使用 java.lang.reflect.Proxy 类来创建代理对象。
通过调用 Proxy.newProxyInstance() 方法并传入以下参数
加载类的 ClassLoader。
目标对象实现的接口数组。
InvocationHandler 对象用于处理代理对象的方法调用。
CGLIB 动态代理:
使用 net.sf.cglib.proxy.Enhancer 类来创建代理对象。
通过调用 Enhancer.create() 方法并设置代理增强器Enhancer的相关属性如设置代理对象的目标对象、回调方法等。
4. 性能比较
JDK 动态代理:
性能较好因为它是基于 Java 语言级别的不涉及字节码操作。
但是如果目标对象实现了多个接口则每次生成代理类时都需要创建新的代理类这可能会导致类加载开销。
CGLIB 动态代理:
性能在大多数情况下略逊于 JDK 动态代理因为涉及到字节码的生成和类加载。
但是由于 CGLIB 可以代理任何类所以在某些情况下它是唯一的选择。
5. 使用场景
JDK 动态代理:
当目标对象实现了接口时首选 JDK 动态代理。
适用于需要对多个实现相同接口的目标对象进行相同行为增强的场景。
CGLIB 动态代理:
当目标对象没有实现接口时或者需要代理所有方法时可以选择 CGLIB 动态代理。
适用于需要对单个目标对象进行行为增强的场景。 如果大家需要视频版本的讲解欢迎关注我的B站