Java面试八股之JDK 动态代理和 CGLIB 动态代理的区别

  1. 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站:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值