【设计模式】 代理模式(静态代理、动态代理{JDK动态代理、JDK动态代理与CGLIB动态代理的区别})
代理模式
代理模式是一种结构型设计模式,它提供了一种替代访问的方法,即通过代理对象来间接访问目标对象。代理模式可以在不改变原始类代码的情况下,增加额外的功能,如权限控制、日志记录等。
静态代理
静态代理是指创建的或特定工具自动生成源代码,在程序运行前代理类的.class文件就已经存在了。每个代理类只能为一个接口服务,如果需要代理多个接口,则需要编写多个代理类,这会增加维护成本。
示例:房子中介(静态代理)
// 房屋租赁服务接口
interface HouseLeaseService {void leaseHouse();
}// 真实主题类 - 房东
class Landlord implements HouseLeaseService {public void leaseHouse() {System.out.println("房东: 出租房屋.");}
}// 静态代理类 - 中介
class RealEstateAgent implements HouseLeaseService {private Landlord landlord;public RealEstateAgent(Landlord landlord) {this.landlord = landlord;}@Overridepublic void leaseHouse() {// 增加额外功能,例如广告宣传System.out.println("中介: 发布租房信息.");landlord.leaseHouse();// 增加额外功能,例如收取中介费System.out.println("中介: 收取中介费用.");}
}public class StaticProxyDemo {public static void main(String[] args) {Landlord landlord = new Landlord();HouseLeaseService agentService = new RealEstateAgent(landlord);agentService.leaseHouse();}
}
在这个例子中,RealEstateAgent作为代理类,不仅实现了HouseLeaseService接口,还包含了对Landlord对象的操作,并在调用前后添加了额外的行为。
–
动态代理
动态代理是在程序运行时动态生成代理类的字节码并加载到JVM中,因此不需要提前编写代理类的代码。Java提供了两种主要的动态代理方式:JDK动态代理和CGLIB。
JDK动态代理
在JDK动态代理中有两个重要的类Proxy和InvocationHandler类
-
Proxy
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。


-
InvocationHandler类
InvocationHandler 是代理实例的调用处理程序 实现的接口。
每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的invoke方法。

代码示例
首先,我们定义一个实现了InvocationHandler接口的处理器类ProxyInvocationHandler ,它负责封装中介的具体业务逻辑。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 房屋租赁服务接口
interface HouseLeaseService {void leaseHouse();
}// 真实主题类 - 房东
class Landlord implements HouseLeaseService {public void leaseHouse() {System.out.println("房东: 出租房屋.");}
}// 实现InvocationHandler接口的处理器类 - 中介
class ProxyInvocationHandler implements InvocationHandler {private final Object target;public ProxyInvocationHandler(Object target) {this.target = target; }@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 在调用真实方法之前可以做一些额外的工作System.out.println("中介: 发布租房信息.");// 调用目标对象的方法Object result = method.invoke(target, args);// 在调用真实方法之后也可以做一些额外的工作System.out.println("中介: 收取中介费用.");return result;}
}public class JdkProxyDemo {public static void main(String[] args) {// 创建真实房东对象Landlord landlord = new Landlord();// 创建动态代理实例HouseLeaseService proxyInstance = (HouseLeaseService) Proxy.newProxyInstance(landlord.getClass().getClassLoader(),landlord.getClass().getInterfaces(),new ProxyInvocationHandler(landlord));// 通过代理实例调用方法proxyInstance.leaseHouse();}
}
JDK动态代理与CGLIB动态代理的区别
| 特性 | JDK 动态代理 | CGLIB 动态代理 |
|---|---|---|
| 实现方式 | 只能代理实现了接口的类(基于接口) | 通过生成目标类的子类进行代理(基于继承) |
| 代理类 | - Proxy - Invocation Handler | - Enhancer - Method Interceptor |
| 核心机制 | 使用反射调用目标方法 | 通过ASM字节码生成目标类的子类,重写方法实现代理 |
| 性能 (jdk8) | 在一百万运行次数内,性能快了30%左右;到五百万运行次数后,性能快了将近一倍 |
相关文章:
【设计模式】 代理模式(静态代理、动态代理{JDK动态代理、JDK动态代理与CGLIB动态代理的区别})
代理模式 代理模式是一种结构型设计模式,它提供了一种替代访问的方法,即通过代理对象来间接访问目标对象。代理模式可以在不改变原始类代码的情况下,增加额外的功能,如权限控制、日志记录等。 静态代理 静态代理是指创建的或特…...
网络安全-攻击流程-用户层
用户层攻击主要针对操作系统中的用户空间应用程序及用户权限,利用软件漏洞、配置错误或用户行为弱点进行攻击。以下是常见的用户层攻击类型及其流程,以及防御措施: 1. 缓冲区溢出攻击 攻击流程: 目标识别:确定存在漏…...
网络安全等级保护测评(等保测评):全面指南与准备要点
等保测评,全称为“网络安全等级保护测评”,是根据《网络安全法》及《网络安全等级保护条例》等法律法规,对信息系统进行安全等级划分,并依据不同等级的安全保护要求,采用科学方法和技术手段,全面评估信息系…...
具身导航赋能智能物流!OpenBench:智能物流最后一公里语义导航新基准
作者:Junhui Wang, Dongjie Huo, Zehui Xu, Yongliang Shi, Yimin Yan, Yuanxin Wang, Chao Gao, Yan Qiao, Guyue Zhou 单位:澳门科技大学系统工程与协作实验室、智能科学与系统联合实验室,清华大学人工智能产业研究院(AIR&…...
详解 本机安装多个MySQL服务【为后续大数据量分库分表奠定基础,以mysql8.0为例,附有图文】
本机安装多个mysql 在电脑上新建mysql8文件夹,然后在mysql8文件下新建mysql3391文件夹。然后找到自己原本mysql的安装目录,我的是E:\software\mysql\one,如图所示: 将次目录下的所有文件全选复制粘贴在mysql3391文件夹下。 然后…...
2025年新趋势:如何利用AI技术优化你的在线帮助中心
在2025年的今天,人工智能(AI)技术正以惊人的速度改变着我们的世界。从自动驾驶汽车到智能家居,从医疗诊断到金融分析,AI的身影无处不在。而在客户服务领域,AI同样正在发挥着越来越重要的作用。特别是在线帮…...
同花顺Java开发面试题及参考答案 (上)
int 类型占用几个字节?float 类型的数字如何与 0 进行比较? 在 Java 中,int 类型是一种基本数据类型,它占用 4 个字节。一个字节有 8 位,所以 int 类型总共是 32 位。这 32 位可以用来表示不同的整数值,其取…...
CommonLang3-使用介绍
摘自:https://www.cnblogs.com/haicheng92/p/18721636 学习要带着目的,参照现实问题 本次目标: 了解 CommonsLang3 API 文档,找对路后以后开发直接查询 API 文档,摈弃盲目的百度掌握基础的字符串、日期、数值等工具…...
Java常用设计模式及其应用场景
1. 什么是设计模式? 设计模式是一个经过多次验证的、针对常见问题的可复用解决方案。设计模式并不是具体的代码实现,而是给出了如何解决问题的思路和结构。在实际开发过程中,设计模式有助于开发者快速找到合适的解决方案,从而减少…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pnalloc函数
ngx_pnalloc 声明在 src\core\ngx_palloc.h void *ngx_pnalloc(ngx_pool_t *pool, size_t size); 定义在 src\core\ngx_palloc.c void * ngx_pnalloc(ngx_pool_t *pool, size_t size) { #if !(NGX_DEBUG_PALLOC)if (size < pool->max) {return ngx_palloc_small(pool, …...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析①】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase01 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-001测试用例 用例ID测试场景验证要点参考条款预期…...
A与B组件自动对齐与组装,无映射直接补偿。
网上针对组装的从视觉到控制动作,要不就是收费,要不就是简单介绍。这么详细的比较难找~ 手下留情,不喜勿喷! Show time~ 分步解决方案: 标定阶段(Calibration) 9点张氏标定(每个位置A1、A2、B1、B2): 使用机械手在相机视野内沿Z字形路径移动,覆盖9个点(XY方…...
QT 读写锁
一、概述 1、读写锁是一种线程同步机制,用于解决多线程环境下的读写竞争问题。 2、读写锁允许多个线程同时获取读锁(共享访问),但只允许一个线程获取写锁(独占访问)。 3、这种机制可以提高并发性能&…...
C++ 的时间库之二:Ratio
从现在开始,我们开始介绍 C 风格的时间处理,在这之前,首先要介绍std::ratio。因为 C 的 chrono库中的时间段(duration)定义离不开std::ratio,不了解std::ratio,就很难理解duration的定义。 1 st…...
使用小雅xiaoya/Emby正确的观看电影电视剧的姿势
最近有很多小伙伴来咨询关于小雅Emby全家桶的使用问题,最常见的就是在Emby上搜索出来资源之后,点击播放会提示【播放错误】,当前没有兼容的流。 这可把很多小伙伴给急坏了……于是找到小白咨询。 嗯……怎么说呢?小白并不喜欢看电…...
Java状态机
目录 1. 概念 2. 定义状态机 3. 生成一个状态机 4. 使用 1. 概念 在Java的应用开发里面,应该会有不少的人接触到一个业务场景下,一个数据的状态会发生多种变化,最经典的例子例如订单,当然还有像用户的状态变化(冻结…...
【Pandas】pandas Series isin
Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐,使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...
通过VSCode直接连接使用 GPT的编程助手
GPT的编程助手在VSC上可以直接使用 选择相应的版本都可以正常使用。每个月可以使用40条,超过限制要付费。 如下图对应的4o和claude3.5等模型都可以使用。VSC直接连接即可。 配置步骤如下: 安装VSCODE 直接,官网下载就行 https://code.vis…...
一种最常见的js加密解密
前言 在前端开发的广袤天地中,你是否遭遇过一些看似“乱码”般的代码,根本无从下手理解?这其实很可能是被 _0x处理过的代码。_0x就像一位神秘的“化妆师”,能把原本清晰的代码改头换面。今天,我就来分享如何破解这些被…...
【Python爬虫(4)】揭开Python爬虫的神秘面纱:基础概念全解析
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
Hugging Face模型推理超快
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 开源模型推理速度革命:从理论到实时应用的突破目录开源模型推理速度革命:从理论到实时应用的突破 引言&a…...
BLV MGN Cube 3D打印机升级Klipper保姆级教程:从树莓派3B到SKR V1.3主板完整配置流程
BLV MGN Cube 3D打印机Klipper固件全栈升级指南:从树莓派部署到SKR主板深度调优 当你的BLV MGN Cube开始出现打印速度瓶颈或运动控制不够流畅时,Klipper固件就像为这台机器注入了新的灵魂。不同于传统Marlin固件在8位主控上的性能局限,Klipp…...
Mem Reduct中文界面终极配置指南:3种方法解决语言切换难题
Mem Reduct中文界面终极配置指南:3种方法解决语言切换难题 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct …...
Docker 27沙箱隔离增强:金融级容器上线前必做的7项合规审计项(等保2.0+GDPR双标覆盖)
更多请点击: https://intelliparadigm.com 第一章:Docker 27沙箱隔离增强的合规性演进与金融场景适配 Docker 27 引入了基于 Linux user_namespaces、seccomp-bpf v2 和 eBPF-based cgroup v2 策略引擎的深度沙箱强化机制,显著提升容器运行时…...
除了Stellar,还有哪些Excel文件修复工具值得一试?一份横向评测与选择指南
Excel文件修复工具横向评测:专业选型指南 当一份关键业务报表突然无法打开,或是财务模型显示"不可读内容"错误时,数据恢复工具的选择直接关系到工作效率与数据安全。市场上除了知名度较高的Stellar系列产品,还有多款各具…...
APK Installer技术架构解析:Windows平台Android应用部署的创新实现
APK Installer技术架构解析:Windows平台Android应用部署的创新实现 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在跨平台应用部署领域,Andro…...
推三返本模式系统设计:一级分销、团队级差与业绩分红机制
上篇文章发出后,有老板留言问:排队免单是省心,但有没有更主动的玩法?我想发动身边的老客户一起帮我推。今天这篇,就是专门聊这种“动态裂变”——推三反本团队奖励。先说明:以下为模式拆解,不构…...
2026年专业级深度榜单:装企GEO 优化公司 TOP5 权威排行
2026年,随着生成式人工智能大模型深度重塑本地服务行业的获客逻辑,装修企业“获客成本高、转化效率低、品牌曝光难”的痛点迎来破局新路径。GEO(生成引擎优化)已成为装企从大模型流量蓝海中获取精准客户的战略级工具。本文结合艾瑞…...
DeepSeek V4:开源大模型的新突破,成本降低、能力提升但落地仍需“脚手架”
编辑部发布:DeepSeek V4引发AI行业热潮解读DeepSeek V4的技术报告,成为这几天AI行业最狂热的集体活动。V4在工程优化维度表现出色,它不走“Scaling Law的暴力美学”路线,而是定义了“模型训练的克制美学”。V4的工程优化成果显著V…...
从‘奇数单增序列’出发,聊聊编程中数据过滤与排序的几种常见思路(附Python/Java实现)
从数据过滤到排序输出:多语言视角下的编程范式实践 在编程的世界里,数据处理是最基础也最核心的技能之一。无论是处理用户输入、分析日志文件,还是构建复杂的算法,我们经常需要从原始数据中筛选出有价值的部分,然后按照…...
