当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/410656.html

相关文章:

  • 验证码邮件接口测试指南?接口的优化策略?
  • 基于Java的智能停车场管理系统
  • 前后端分离开发遵循接口规范-YAPI
  • 把本地的项目代码初始化到git仓库
  • 白杨SEO:公众号如何找选题?如何利用ai工具写公众号?公众号变现方式有哪些?22个公众号营销常见问题解答大全!
  • 零基础学习深度学习以及模块缝合总结
  • XXE-lab-master靶场:PHP_xxe
  • 视图,存储过程和触发器
  • sqli-labs(6-10)关通关讲解
  • 【解决方法】git clone出现 curl 56 OpenSSL SSL_read: Connection was reset, errno 10054
  • 机械拆装-基于Unity-本地数据持久化
  • 【SpringBoot】4.3.5 参数传递之ModelAndView对象
  • 《技术人求职之道》之简历优化篇(上):量身打造简历,如何与自身情况完美匹配
  • mysql+php+html实现学生管理系统
  • find+rm一行命令删除文件夹及子文件夹下文件,不删除子文件夹,或者用python实现
  • 超详细的linux-conda环境安装教程
  • vite项目构建配置
  • Java 反射机制与Spring框架的那点事
  • 计算机网络面试题3
  • day54|110.字符串接龙, 105.有向图的完全可达性, 106.岛屿的周长
  • 使用docker在CentOS 7上安装php+mysql+nginx环境教程并运行WordPress
  • vite tsx项目的element plus集成 - 按需引入踩坑
  • Android GreenDao 升级 保留旧表数据
  • 记一次证书站有趣的SQL注入
  • 1_初识pytorch
  • c++typeid()的使用
  • 【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十四)-租云服务器及配环境、docker基本命令
  • 实现一个全栈模糊搜索匹配的功能
  • 智慧景区导览系统小程序开发
  • HIVE调优方式及原因