结构型模式-代理模式
本文介绍了代理模式其他常见设计模式在本系列其他文章有兴趣可了解文章目录代理模式静态代理动态代理**JDK动态代理****CGLIB代理**总结代理模式静态代理举一个音乐会买票的例子感受一下静态代理定义一个售卖接口publicinterfaceSell{publicvoidsell();}定义音乐会售票类publicclassConcertSellimplementsSell{Overridepublicvoidsell(){System.out.println(卖票);}}定义中介类Java有自带的Proxy类最好不要使用Proxy作为类名在动态代理中我们会用到这个类中介增强了ConcertSell的功能publicclassProxyPointimplementsSell{privateConcertSellconcertSellnewConcertSell();Overridepublicvoidsell(){System.out.println(中介收取费用);concertSell.sell();}}运行publicclassClient{publicstaticvoidmain(String[]args){ProxyPointproxynewProxyPoint();proxy.sell();}}结果中介收取费用 卖票这里使用了接口使用接口比使用抽象父类耦合度低音乐会售票类和中介类都继承这个接口他们必须实现接口中的抽象方法中介类在实现的方法中使用了音乐会售票类的方法中介类在不影响音乐会售票类的同时增强了其功能动态代理JDK动态代理JDK动态代理只能代理接口中定义的方法换句话说目标类有接口才能用JDK动态代理JDK动态代理不是代理了目标类ConcertSell而是通过反射使用了目标类实例对象的方法准备好接口和目标类接口publicinterfaceSell{publicvoidsell();publicvoidsell2();}目标类publicclassConcertSellimplementsSell{Overridepublicvoidsell(){System.out.println(卖场次1票);}Overridepublicvoidsell2(){System.out.println(卖场次2票);}}我们直接使用工厂模式建一个ProxyFactory工厂将细节封装到这个工厂类中通过一个getProxy方法得到代理对象publicclassProxyFactory{privateConcertSellconcertSellnewConcertSell();/*执行newProxyInstance()方法时Java底层在内存中动态生成$Proxy0.class字节码 必须通过类加载器加载到JVM内存中才能成为一个可用的代理类 newProxyInstance()方法返回的是这个代理类的实例对象并由 proxy 变量接收。 *//*newProxyInstance()方法有三个参数 第一个参数是获取一个类加载器用来加载$Proxy0.class到JVM内存中, 第二个参数是获取目标类实现的接口数组(这就是JDK动态代理只能代理接口中定义的方法的原因) 第三个参数是匿名内部类形式其中有一个invoke方法(这里涉及到了反射)invoke方法三个参数分别是 Object proxy(代理对象自身), Method method(外部调用的接口方法), Object[] args(调用时传入的参数数组), method.invoke()利用了反射(这里的invoke方法和匿名内部类的invoke方法意义不同)调用了目标类实例对象的方法 在invoke方法里可以对目标类实例对象方法进行增强 */publicSellgetProxy(){//JDK动态代理代理的是接口中的方法强转类型自然是接口类型Sellproxy(Sell)Proxy.newProxyInstance(concertSell.getClass().getClassLoader(),concertSell.getClass().getInterfaces(),newInvocationHandler(){OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{//方法体System.out.println(中介收取费用);method.invoke(concertSell,args);returnnull;}});returnproxy;}}运行publicclassClient{publicstaticvoidmain(String[]args){ProxyFactoryfactorynewProxyFactory();Sellproxyfactory.getProxy();proxy.sell();proxy.sell2();}}结果中介收取费用 卖场次1票 中介收取费用 卖场次2票CGLIB代理CGLIB代理可以为没有实现接口的类提供代理CGLIB代理类是目标类的子类要求目标类可继承因此CGLIB代理不能代理final修饰的类CGLIB代理是第三方提供的包需引入对应jar包maven工程中可引入jar包坐标放在标签里dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version/dependencyjdk17报错可以将以上依赖替换为dependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion6.1.8/version/dependency同时包名也要替换// 原来是// import net.sf.cglib.proxy.Enhancer;// 现在改为importorg.springframework.cglib.proxy.Enhancer;其他包名同理将net.sf改为org.springframework报错原因有兴趣可自行搜索准备目标类ConcertSellpublicclassConcertSell{publicvoidsell(){System.out.println(卖场次1票);}publicvoidsell2(){System.out.println(卖场次2票);}}我们同样使用工厂模式建一个ProxyFactory工厂将细节封装到这个工厂类中通过一个getProxy方法得到代理对象publicclassProxyFactoryTimplementsMethodInterceptor{privatefinalClassTtargetClass;//创建ProxyFactory对象时将目标类字节码传递过来使ProxyFactory工厂成为一个通用工厂publicProxyFactory(ClassTtargetClass){this.targetClasstargetClass;}publicTgetProxy(){//创建工具类对象EnhancerenhancernewEnhancer();//告诉CGLIB要生成的代理类必须继承T(传过来的类型)enhancer.setSuperclass(targetClass);//设置回调函数当代理对象的方法被调用时会回调当前类的intercept方法//这里的参数要求必须是Callback接口的子类。而MethodInterceptor正是Callback最重要的子接口enhancer.setCallback(this);//返回代理对象并强转成目标类类型return(T)enhancer.create();}OverridepublicObjectintercept(Objecto,Methodmethod,Object[]objects,MethodProxymethodProxy)throwsThrowable{System.out.println(CGLIB中介收取费用);//可以使用method.invoke(o, objects)但这样就是利用反射调用方法了效率低//CGLIB的优势不是通过传统反射来调用父类方法而是通过动态生成的字节码直接调用类似invokevirtual指令性能远高于JDK原生反射ObjectresultmethodProxy.invokeSuper(o,objects);returnresult;}}运行publicclassClient{publicstaticvoidmain(String[]args){ProxyFactoryConcertSellproxyFactorynewProxyFactory(ConcertSell.class);ConcertSellproxyproxyFactory.getProxy();//代理对象的方法被调用时会回调intercept方法proxy.sell();proxy.sell2();}}结果CGLIB中介收取费用 卖场次1票CGLIB中介收取费用 卖场次2票总结以上就是本期要讲的内容本文介绍了代理模式其他常见设计模式在本系列其他文章有兴趣可了解

相关新闻

开源文件转换工具实战:从环境部署到批量处理与生产集成

开源文件转换工具实战:从环境部署到批量处理与生产集成

这类工具最值得先看的不是功能列表,而是能不能在普通环境里稳定跑起来,以及它到底解决了哪一类具体的文件转换痛点。很多人看到“文件转换”就觉得是万能的,结果下载下来发现支持的格式有限,或者依赖复杂,跑不起来。这…

2026/8/18 12:24:40 阅读更多 →
智能汽车安全架构解析:从TEE到数据加密,构建可信数字守护

智能汽车安全架构解析:从TEE到数据加密,构建可信数字守护

1. 从“门神”到“雄狮”:一次品牌安全理念的具象化升级 最近在关注汽车智能化领域的朋友,可能都注意到了奇瑞的一个新动作——“雄狮智云守护计划”。这个名字本身就很有意思,它把“雄狮”这个品牌IP和“守护”这个核心功能直接绑定在了一起…

2026/8/19 16:19:48 阅读更多 →
AI Agent技能开发实战:从原理到部署的完整指南

AI Agent技能开发实战:从原理到部署的完整指南

这次我们来看一个关于 AI Agent 技能(Skill)构建的开源项目。对于想要深入 AI Agent 开发,尤其是希望让 Agent 具备特定、可复用能力的开发者来说,如何系统地设计、实现和集成 Skill 是一个核心挑战。这个项目提供了一个从理论到实…

2026/8/18 12:24:39 阅读更多 →

最新新闻

工业机器人分布式协同控制:验证门控与智能体化任务治理实践

工业机器人分布式协同控制:验证门控与智能体化任务治理实践

1. 项目概述:当工业机器人集群有了“任务管家” 在智能工厂的产线上,你可能会看到这样的场景:一组AGV小车正在协同搬运物料,几台机械臂在装配线上精准配合,还有巡检机器人穿梭于设备之间。过去,这些机器人各…

2026/8/19 22:13:34 阅读更多 →
[作品集]-山东通占道申请审批

[作品集]-山东通占道申请审批

2026/8/19 22:13:34 阅读更多 →
AI大模型与数学 第38课 条件极值入门:拉格朗日乘数法基础计算(10道约束优化计算题)

AI大模型与数学 第38课 条件极值入门:拉格朗日乘数法基础计算(10道约束优化计算题)

课程前言 上课学习无约束损失极值判定,而真实AI训练几乎全部带约束:权重衰减、参数限制、归一化约束、模型内存上限,对应条件极值,拉格朗日乘数法是求解带约束优化的标准数学工具。 我们先理解:拉格朗日乘法解决的是&a…

2026/8/19 22:13:34 阅读更多 →
C语言基础知识-学习笔记

C语言基础知识-学习笔记

1.IDE开发工具:1.1.常用开发工具很多,本次学习用的是Visual Studio,官网直接下载,免费使用,下载安装方便。2.C语言概述2.1.概述:通俗来说就是一种机器语言,人与机器交互的工具。C语言通过编译&a…

2026/8/19 22:13:34 阅读更多 →
从零构建企业级入侵检测系统:基于Suricata与ELK的实战指南

从零构建企业级入侵检测系统:基于Suricata与ELK的实战指南

1. 项目概述:从“防盗门”到“智能哨兵”几年前,我还在为一个大型数据中心的安全运维头疼。机房里的服务器日夜不停地运转,承载着海量的业务数据。传统的防火墙和杀毒软件就像大楼的锁和门禁,能挡住一些明显的“破门而入”&#x…

2026/8/19 22:13:34 阅读更多 →
远程PCIe连接技术:破解汽车高性能计算成本困局

远程PCIe连接技术:破解汽车高性能计算成本困局

1. 项目背景:当高性能计算遇上车辆成本困局最近和几个做智能驾驶和座舱域控制器的朋友聊天,大家普遍都在头疼同一个问题:车规级高性能计算平台的成本。一颗高算力的车规级SoC,比如那些能跑Transformer大模型或者处理多路8K摄像头数…

2026/8/19 22:12:33 阅读更多 →

日新闻

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:30 阅读更多 →
AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:30 阅读更多 →
WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 一台刚配的新电脑,跑《魔兽争霸3》却卡成 PPT——这…

2026/8/19 0:02:31 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/19 11:55:18 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/19 9:46:27 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/19 11:55:16 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/19 5:04:55 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/19 7:42:22 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/19 11:55:13 阅读更多 →