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

【设计模式】 代理模式(静态代理、动态代理{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动态代理中有两个重要的类ProxyInvocationHandler

  • 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 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月14日 关键词&#xff1a;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、读写锁是一种线程同步机制&#xff0c;用于解决多线程环境下的读写竞争问题。 2、读写锁允许多个线程同时获取读锁&#xff08;共享访问&#xff09;&#xff0c;但只允许一个线程获取写锁&#xff08;独占访问&#xff09;。 3、这种机制可以提高并发性能&…...

C++ 的时间库之二:Ratio

从现在开始&#xff0c;我们开始介绍 C 风格的时间处理&#xff0c;在这之前&#xff0c;首先要介绍std::ratio。因为 C 的 chrono库中的时间段&#xff08;duration&#xff09;定义离不开std::ratio&#xff0c;不了解std::ratio&#xff0c;就很难理解duration的定义。 1 st…...

使用小雅xiaoya/Emby正确的观看电影电视剧的姿势

最近有很多小伙伴来咨询关于小雅Emby全家桶的使用问题&#xff0c;最常见的就是在Emby上搜索出来资源之后&#xff0c;点击播放会提示【播放错误】&#xff0c;当前没有兼容的流。 这可把很多小伙伴给急坏了……于是找到小白咨询。 嗯……怎么说呢&#xff1f;小白并不喜欢看电…...

Java状态机

目录 1. 概念 2. 定义状态机 3. 生成一个状态机 4. 使用 1. 概念 在Java的应用开发里面&#xff0c;应该会有不少的人接触到一个业务场景下&#xff0c;一个数据的状态会发生多种变化&#xff0c;最经典的例子例如订单&#xff0c;当然还有像用户的状态变化&#xff08;冻结…...

【Pandas】pandas Series isin

Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐&#xff0c;使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...

通过VSCode直接连接使用 GPT的编程助手

GPT的编程助手在VSC上可以直接使用 选择相应的版本都可以正常使用。每个月可以使用40条&#xff0c;超过限制要付费。 如下图对应的4o和claude3.5等模型都可以使用。VSC直接连接即可。 配置步骤如下&#xff1a; 安装VSCODE 直接&#xff0c;官网下载就行 https://code.vis…...

一种最常见的js加密解密

前言 在前端开发的广袤天地中&#xff0c;你是否遭遇过一些看似“乱码”般的代码&#xff0c;根本无从下手理解&#xff1f;这其实很可能是被 _0x处理过的代码。_0x就像一位神秘的“化妆师”&#xff0c;能把原本清晰的代码改头换面。今天&#xff0c;我就来分享如何破解这些被…...

【Python爬虫(4)】揭开Python爬虫的神秘面纱:基础概念全解析

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

Hugging Face模型推理超快

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 开源模型推理速度革命&#xff1a;从理论到实时应用的突破目录开源模型推理速度革命&#xff1a;从理论到实时应用的突破 引言&a…...

BLV MGN Cube 3D打印机升级Klipper保姆级教程:从树莓派3B到SKR V1.3主板完整配置流程

BLV MGN Cube 3D打印机Klipper固件全栈升级指南&#xff1a;从树莓派部署到SKR主板深度调优 当你的BLV MGN Cube开始出现打印速度瓶颈或运动控制不够流畅时&#xff0c;Klipper固件就像为这台机器注入了新的灵魂。不同于传统Marlin固件在8位主控上的性能局限&#xff0c;Klipp…...

Mem Reduct中文界面终极配置指南:3种方法解决语言切换难题

Mem Reduct中文界面终极配置指南&#xff1a;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双标覆盖)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Docker 27沙箱隔离增强的合规性演进与金融场景适配 Docker 27 引入了基于 Linux user_namespaces、seccomp-bpf v2 和 eBPF-based cgroup v2 策略引擎的深度沙箱强化机制&#xff0c;显著提升容器运行时…...

除了Stellar,还有哪些Excel文件修复工具值得一试?一份横向评测与选择指南

Excel文件修复工具横向评测&#xff1a;专业选型指南 当一份关键业务报表突然无法打开&#xff0c;或是财务模型显示"不可读内容"错误时&#xff0c;数据恢复工具的选择直接关系到工作效率与数据安全。市场上除了知名度较高的Stellar系列产品&#xff0c;还有多款各具…...

APK Installer技术架构解析:Windows平台Android应用部署的创新实现

APK Installer技术架构解析&#xff1a;Windows平台Android应用部署的创新实现 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在跨平台应用部署领域&#xff0c;Andro…...

推三返本模式系统设计:一级分销、团队级差与业绩分红机制

上篇文章发出后&#xff0c;有老板留言问&#xff1a;排队免单是省心&#xff0c;但有没有更主动的玩法&#xff1f;我想发动身边的老客户一起帮我推。今天这篇&#xff0c;就是专门聊这种“动态裂变”——推三反本团队奖励。先说明&#xff1a;以下为模式拆解&#xff0c;不构…...

2026年专业级深度榜单:装企GEO 优化公司 TOP5 权威排行

2026年&#xff0c;随着生成式人工智能大模型深度重塑本地服务行业的获客逻辑&#xff0c;装修企业“获客成本高、转化效率低、品牌曝光难”的痛点迎来破局新路径。GEO&#xff08;生成引擎优化&#xff09;已成为装企从大模型流量蓝海中获取精准客户的战略级工具。本文结合艾瑞…...

DeepSeek V4:开源大模型的新突破,成本降低、能力提升但落地仍需“脚手架”

编辑部发布&#xff1a;DeepSeek V4引发AI行业热潮解读DeepSeek V4的技术报告&#xff0c;成为这几天AI行业最狂热的集体活动。V4在工程优化维度表现出色&#xff0c;它不走“Scaling Law的暴力美学”路线&#xff0c;而是定义了“模型训练的克制美学”。V4的工程优化成果显著V…...

从‘奇数单增序列’出发,聊聊编程中数据过滤与排序的几种常见思路(附Python/Java实现)

从数据过滤到排序输出&#xff1a;多语言视角下的编程范式实践 在编程的世界里&#xff0c;数据处理是最基础也最核心的技能之一。无论是处理用户输入、分析日志文件&#xff0c;还是构建复杂的算法&#xff0c;我们经常需要从原始数据中筛选出有价值的部分&#xff0c;然后按照…...