【面试问题】JDK 动态代理与 CGLIB 区别?

简介: 【1月更文挑战第27天】【面试问题】JDK 动态代理与 CGLIB 区别?

JDK 动态代理和 CGLIB(Code Generation Library)是两种常见的 Java 动态代理技术,它们在实现方式和应用场景上存在一些区别。

1. 实现方式:

  • JDK 动态代理:
  • 使用 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口。
  • 只能代理实现了接口的类,生成的代理对象是接口的实现类。
  • 通过 Java 反射机制在运行时动态生成代理类。
  • CGLIB 动态代理:
  • 使用 CGLIB 库,它通过字节码技术生成目标类的子类作为代理。
  • 可以代理没有实现接口的类。
  • 通过修改字节码生成新的类,使其成为目标类的子类,从而实现代理。

2. 代理对象类型:

  • JDK 动态代理:
  • 代理对象实现了被代理接口。
  • 要求目标类必须实现接口,因为代理对象是接口的实现类。
  • CGLIB 动态代理:
  • 代理对象是目标类的子类。
  • 可以代理没有实现接口的类,包括 final 类。

3. 性能:

  • JDK 动态代理:
  • 生成的代理类较轻量,创建速度相对较快。
  • 在方法调用上的性能比 CGLIB 略低,因为使用了 Java 反射机制。
  • CGLIB 动态代理:
  • 生成的代理类较重量,创建速度相对较慢。
  • 在方法调用上的性能比 JDK 动态代理高,因为直接通过生成的子类调用方法,无需通过反射。

4. 对目标类要求:

  • JDK 动态代理:
  • 要求目标类必须实现接口,否则无法生成代理。
  • CGLIB 动态代理:
  • 可以代理没有实现接口的类。

5. 应用场景:

  • JDK 动态代理:
  • 适用于对接口进行代理的场景,如 AOP(面向切面编程)。
  • CGLIB 动态代理:
  • 适用于对类进行代理的场景,特别是当目标类没有实现接口或者需要代理类为目标类的子类时。

6. 可见性和访问控制:

  • JDK 动态代理:
  • 受限于接口中声明的方法,只能代理接口中的公共方法。
  • CGLIB 动态代理:
  • 可以代理目标类中的所有非 final 的方法,包括私有方法。、


选择使用 JDK 动态代理还是 CGLIB 动态代理取决于具体的需求和场景。如果目标类已经实现了接口,且要求代理对象也实现相同接口,那么 JDK 动态代理是个不错的选择。如果目标类没有实现接口,或者需要代理类为目标类的子类,那么 CGLIB 动态代理更为适合。在实际应用中,有时候也会结合使用两者,根据情况选择最合适的代理方式。

相关文章
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
93 14
|
1月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
2月前
|
Java 编译器 API
深入解析:JDK与JVM的区别及联系
在Java开发和运行环境中,JDK(Java Development Kit)和JVM(Java Virtual Machine)是两个核心概念,它们在Java程序的开发、编译和运行过程中扮演着不同的角色。本文将深入解析JDK与JVM的区别及其内在联系,为Java开发者提供清晰的技术干货。
44 1
|
2月前
|
安全 Java 开发者
AOP中的JDK动态代理与CGLIB动态代理:深度解析与实战模拟
【11月更文挑战第21天】面向切面编程(AOP,Aspect-Oriented Programming)是一种编程范式,它通过将横切关注点(cross-cutting concerns)与业务逻辑分离,以提高代码的可维护性和可重用性。在Java开发中,AOP的实现离不开动态代理技术,其中JDK动态代理和CGLIB动态代理是两种常用的方式。本文将从背景、历史、功能点、业务场景、底层逻辑等多个维度,深度解析这两种代理方式的区别,并通过Java示例进行模拟和比较。
117 5
|
2月前
|
小程序 Java 程序员
JDK 和 JRE 有什么区别
JDK(Java Development Kit)是Java开发工具包,包含编译器、调试器等开发工具,用于开发Java程序。JRE(Java Runtime Environment)是Java运行环境,包含Java虚拟机和类库,用于运行Java程序。简言之,JDK用于编写Java程序,JRE用于运行这些程序。
83 1
|
2月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
3月前
|
Java Spring 数据库连接
[Java]代理模式
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
54 0
[Java]代理模式
|
3月前
|
Java
【编程进阶知识】静态代理、JDK动态代理及Cglib动态代理各自存在的缺点及代码示例
本文介绍了三种Java代理模式:静态代理、JDK动态代理和Cglib动态代理。静态代理针对特定接口或对象,需手动编码实现;JDK动态代理通过反射机制实现,适用于所有接口;Cglib动态代理则基于字节码技术,无需接口支持,但需引入外部库。每种方法各有优缺点,选择时应根据具体需求考虑。
38 1
|
5月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!