Java面试八股之JDK 动态代理和 CGLIB 动态代理的区别
- 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站:

相关文章:
Java面试八股之JDK 动态代理和 CGLIB 动态代理的区别
JDK 动态代理和 CGLIB 动态代理的区别 JDK 动态代理和 CGLIB 动态代理都是在 Java 中实现动态代理的两种常见方式。它们各自有不同的特点和适用场景。下面详细介绍一下这两种动态代理的区别: 1. 代理机制 JDK 动态代理: 实现原理: JDK 动态代理基于 Java 的反射…...
验证码邮件接口测试指南?接口的优化策略?
验证码邮件接口集成步骤与注意事项?API接口设计要点? 在现代应用程序开发中,验证码邮件接口是保障用户安全和验证身份的重要工具。AokSend将详细介绍验证码邮件接口的测试指南,帮助开发者确保接口的稳定性和可靠性。 验证码邮件…...
基于Java的智能停车场管理系统
你好,我是计算机学姐码农小野!如果你对智能停车场管理系统感兴趣或有相关需求,欢迎私信联系我。 开发语言: Java 数据库: MySQL 技术: JSP技术 JAVA B/S架构 工具: 浏览器(…...
前后端分离开发遵循接口规范-YAPI
目前,网站主流开发方式是前后端分离。因此前后端必须遵循一套统一的规范,才能保证前后端进行正常的数据(JSON数据格式)请求、影响,这套规范即是 YAPI. 产品经理撰写原型; 前端或后端撰写接口文档。 YAPI…...
把本地的项目代码初始化到git仓库
cd /path/to/your/project# 在当前目录创建新的仓库 git init# 添加当前目录下的所有文件到暂存区 git add .# 添加commit message git commit -m "Initial commit"# 关联远程仓库 git remote add origin https://github.com/username/repository.git# 更改默认仓库&…...
白杨SEO:公众号如何找选题?如何利用ai工具写公众号?公众号变现方式有哪些?22个公众号营销常见问题解答大全!
前言:为什么分享这个?因为我发现不管是SEO从业者还是自媒体从业者,想通过公众号来做影响力或流量,甚至变现,但很多朋友公众号都没弄懂,所以分享一下。 分享问题大纲如下: 1、公众号如何申请注册…...
零基础学习深度学习以及模块缝合总结
Python基础知识 推荐视频:黑马程序员python教程,8天python从入门到精通,学python看这套就够了_哔哩哔哩_bilibili 工具和资源:PyTorch、Zotero、谷歌学术、Github、B站、ChatGPT等。 深度学习基本知识 张量维度表示:…...
XXE-lab-master靶场:PHP_xxe
目录 有回显 测试回显位置 构建payload 无回显数据外带 构建payload 漏洞修复 XXE-lab是一个一个包含php,java,python,C#等各种语言版本的XXE漏洞靶场。 下载地址:https://github.com/c0ny1/xxe-lab 将PHPStudy的中间件与版本信息调制为 php-5.4.29Apache 以…...
视图,存储过程和触发器
目录 视图 创建视图: 视图的使用 查看库中所有的视图 删除视图 视图的作用: 存储过程: 为什么使用存储过程? 什么是存储过程? 存储过程的创建 创建一个最简单的存储过程 使用存储过程 删除存储过程 带参的存储…...
sqli-labs(6-10)关通关讲解
sqli-labs(6-10)关通关讲解 Less-6 方法一:手工注入 1.判断闭合 http://localhost/sqli-labs/Less-6/?id1" //报错 http://localhost/sqli-labs/Less-6/?id1" -- //正常 http://localhost/sqli-labs/Less-6/?id1" and 11 -- http://localhos…...
【解决方法】git clone出现 curl 56 OpenSSL SSL_read: Connection was reset, errno 10054
当我们克隆别人的项目出现以下提示信息时候 remote: Enumerating objects: 7095, done. error: RPC failed; curl 56 OpenSSL SSL_read: Connection was reset, errno 10054 error: 2292 bytes of body are still expected fetch-pack: unexpected disconnect while reading s…...
机械拆装-基于Unity-本地数据持久化
目录 1. 数据结构简介:数据的集合 1.1 线性数据结构 1.2 非线性数据结构 2. 对数据集合的操作: 3. 数据持久化 3.1 数据的序列化存储 3.2 JSON文件硬盘存储 3.2.1 Json文件允许存储的数据类型 3.2.2 Json文件的语法格式 3.2.3 Json文件的读取 3.2.4 …...
【SpringBoot】4.3.5 参数传递之ModelAndView对象
ModelAndView也是SpringMVC中常用的数据返回对象。当控制器处理完请求时,通常会将包含视图对象和数据的ModelAndView对象一起返回前台。它的作用类似request对象的setAttribute()方法。 ModelAndView对象有两个作用: 1)设置转向地址(这也是ModelAndView和ModelMap的…...
《技术人求职之道》之简历优化篇(上):量身打造简历,如何与自身情况完美匹配
摘要 在求职过程中,简历优化是提升面试机会的关键步骤。本文将探讨如何通过精心设计简历来提高求职成功率。文章将首先指出,不存在完美简历,重要的是根据个人实际情况定制简历。接着,详细介绍撰写简历时应遵循的基本原则和要素&a…...
mysql+php+html实现学生管理系统
mysqlphphtml实现学生管理系统 前言 本文使用Mysqlphphtml实现一个简单的学生管理系统,实现了登陆,注册,总览学生信息,添加学生,查询特定的学生,删除指定的学生等功能。并且本文仅用来学习就够了…...
find+rm一行命令删除文件夹及子文件夹下文件,不删除子文件夹,或者用python实现
如果你正在使用类Unix操作系统(如Linux或macOS),并希望使用命令行工具rm来删除一个文件夹及其子文件夹下的所有文件,同时保留文件夹结构,你可以使用find命令配合rm来实现这一操作。这种方法非常高效且常用于批量删除文…...
超详细的linux-conda环境安装教程
安装和配置Linux系统中的Conda环境是一个强大的工具,它可以帮助用户管理Python及其库。以下是一份超详细的Linux-Conda环境安装教程: 1. 安装前的准备 确保你的Linux系统已经更新到最新版本,并安装了基本的开发工具和库。 sudo apt-get up…...
vite项目构建配置
1、用vite搭建项目 使用npm create vitelatest构建项目,配置项选项react->tsSWC即可。 让后打开项目npm i。 2、项目配置 2.1、vite配置 主要是配置用到的插件(plugins--比如:svg、mock等)、路径、环境变量的使用、打包、…...
Java 反射机制与Spring框架的那点事
Java 反射机制是 Java 语言提供的一种能力,允许程序在运行时查询、访问和修改它自己的结构和行为。反射机制非常有用,但同时也需要谨慎使用,因为它可能会带来性能开销和安全风险。 以下是 Java 反射机制的一些关键概念和用法: Cl…...
计算机网络面试题3
四次挥手 断开连接需要四次挥手 1.客户端发送一个FIN(SEQx)标志的数据包到服务端,用来关闭客户端到服务端的数据传送, 然后客户端进入FIN-WAIT-1状态。 2.服务端收到一个FIN(SEQx)标志的数据包,它…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
