静态代理和动态代理的区别

静态代理和动态代理 想理解静态代理和动态代理之前得先理解什么是代理:比如说调用A的方法实现业务,使用代理模式之后我们就不再直接调用A的方法了,而是在中间加了一个代理类,由代理类去调用A。相当于从直接调用变成间接调用,好处就是我们可以在代理类中对A的业务进行增强(拓展一些不属于目标方法的功能),在目标方法执行前后添加其他的业务逻辑,比如事务的开启和事务的提交等等。 代理模式只是一种设计思想,但在具体的实现上又分为静态代理和动态代理。 本文以JDK动态代理为示例,JDK动态代理是基于接口的方式,代理类和 阅读详情

静态代理和动态代理的区别

在软件开发领域,代理模式是一种常用的设计模式,它可以为其他对象提供一种代理以控制对这个对象的访问。代理模式分为静态代理和动态代理,它们在实现方式、应用场景等方面存在着一些明显的区别。本文将深入探讨静态代理和动态代理的区别,帮助大家更好地理解和应用这两种代理模式。

一、静态代理

静态代理是指在编译期就已经确定了代理类和目标类的关系,代理类是在编译前就手动编写好的。代理类和目标类实现相同的接口或者继承相同的抽象类,代理类中持有目标类的引用,通过调用目标类的方法来实现具体的功能。

示例代码:

// 定义接口
interface Subject {
    void request();
}

// 目标类
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject is handling the request.");
    }
}

// 代理类
class ProxySubject implements Subject {
    private RealSubject realSubject;

    public ProxySubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void request() {
        System.out.println("ProxySubject pre-handling.");
        realSubject.request();
        System.out.println("ProxySubject post-handling.");
    }
}

在上述代码中,Subject 是定义的接口,RealSubject 是实现该接口的目标类,ProxySubject 是代理类。代理类 ProxySubject 持有目标类 RealSubject 的引用,并在调用目标类的 request 方法前后添加了一些额外的处理逻辑。

二、动态代理

动态代理是在运行时动态地生成代理类,不需要在编译前手动编写代理类的代码。在 Java 中,动态代理主要通过 java.lang.reflect.Proxy 类和 InvocationHandler 接口来实现。动态代理可以在运行时根据需要为不同的目标类创建代理对象,具有更高的灵活性。

示例代码:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 定义接口
interface Subject {
    void request();
}

// 目标类
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject is handling the request.");
    }
}

// 实现InvocationHandler接口
class DynamicProxyHandler implements InvocationHandler {
    private Object target;

    public DynamicProxyHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("DynamicProxy pre-handling.");
        Object result = method.invoke(target, args);
        System.out.println("DynamicProxy post-handling.");
        return result;
    }
}

// 测试动态代理
public class DynamicProxyExample {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        InvocationHandler handler = new DynamicProxyHandler(realSubject);
        Subject proxy = (Subject) Proxy.newProxyInstance(
                realSubject.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                handler
        );
        proxy.request();
    }
}

在上述代码中,DynamicProxyHandler 实现了 InvocationHandler 接口,重写了 invoke 方法。在 invoke 方法中,在调用目标类的方法前后添加了额外的处理逻辑。通过 Proxy.newProxyInstance 方法动态生成代理对象,该方法接受三个参数:目标类的类加载器、目标类实现的接口数组、InvocationHandler 实例。

三、静态代理和动态代理的区别

  1. 代理类生成时机:静态代理的代理类在编译期就已经确定并生成,而动态代理的代理类是在运行时根据需要动态生成的。
  2. 代码灵活性:静态代理的代理类和目标类的关系在编译期就固定下来,如果目标类的接口发生变化,代理类也需要相应地修改代码来实现新的接口方法。而动态代理可以在运行时动态地处理不同的目标类和接口,当目标类的接口变化时,不需要修改代理类的代码,只需要在运行时根据新的接口动态生成代理类,灵活性更高。
  3. 适用场景:静态代理适用于代理类和目标类的关系比较固定,且接口方法不会频繁变动的场景。动态代理常用于框架开发(如 Spring 的 AOP 实现),可以在运行时根据配置动态地为不同的目标对象创建代理,实现诸如事务管理、日志记录等功能。
  4. 性能方面:静态代理由于代理类是在编译期生成的,其调用性能相对较高。而动态代理在运行时生成代理类并进行反射调用,会有一定的性能开销。
第8.1节 满足构网要求的功率器件与散热设计 摘要: 构网型变流器的功率器件选型与散热设计面临严苛要求,需综合考虑过载能力、暂态应力与可靠性。IGBT模块选型需重点评估电压/电流等级、损耗特性及结温波动,而SiC MOSFET虽具有高频低损耗优势,但面临栅极可靠性等挑战。散热设计需采用液冷等先进技术控制结温波动,并通过电热应力仿真和寿命预测实现可靠性优化。系统化选型流程需结合规范要求、工况谱分析和实测验证,为构网型变流器提供坚实的物理基础。 阅读详情

相关推荐

Windows 10/11 零基础配置 SillyTavern 连接 Claude API 完整指南(含 Node.js 环境搭建)

本文提供Windows 10/11系统下零基础配置SillyTavern连接Claude API的完整教程,涵盖Node.js环境搭建、SillyTavern初始化及API连接配置等关键步骤。通过详细的操作指南和实用技巧,帮助用户快速搭建AI聊天界面并优化对话体验,实现与Claude AI的高效交互。

weixin_30642561的博客 134

动态代理和静态代理到底有什么区别,好处在哪里?

动态代理和静态代理到底有什么区别,好处在哪里?

mine_song的博客 2万+

如何在windows下使用cmake编译源码

MyProject/└── build/在MyProject目录下创建并编辑。创建build目录并进入。使用cmake命令生成构建文件。使用适当的命令编译项目。运行生成的可执行文件。

cdj444asdg的博客 3345

动态代理详解

想要更加透彻的理解动态代理,首先要熟悉下静态代理。

白羊座的橙子 1万+

ADS学习笔记 1. 功率放大器设计

基于ADS2023 update2的学习笔记1.功率放大器设计

u014087103的博客 1万+

Docker离线部署OpenWebUI操作步骤

docker离线部署openwebui

m0_49333265的博客 4353

代理模式:一文彻底搞懂静态代理和动态代理

代理模式(Proxy Pattern)是一种结构型设计模式,它的概念很简单,它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个角色:代理角色和真实角色。代理类负责代理真实类,为真实类提供控制访问的功能,真实类则完成具体的业务逻辑。这样,当我们不方便或者不能直接访问真实对象时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。代理模式的原理是将真实类的功能封装在代理类中,最基本的方式就是创建一个代理类,代理类实现和真实类相同的接口,并且在代理类中引用真

qq_36756227的博客 1万+

Python抓取摄像头图像,进行AI识别(一)

本文介绍了如何用Python获取海康威视摄像头的图像并进行AI识别。主要内容包括:1)准备工作,包括摄像头IP设置和密码重置方法;2)使用Python的Requests库通过ISAPI接口获取实时图像;3)示例代码展示如何保存摄像头图像。整个过程为后续AI图像识别提供了基础,通过简单的Python代码即可实现专业监控设备的图像采集功能。

Hahafantuan的博客 1514

JAVA静态代理和动态代理理解

代理 代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了。 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人。 这里写图片描述 按理说,顾客可以直接从厂家购买产品,但是现实生活中,很少有这样的销售模式。一般都是厂家委托给代理商进行销售,顾客跟代理商打交道,而不直接与产品实际生产者进行关联。 所以,代理就有一种中间人的味道。 接下来,我们说说软件中的代理模式。 代理模式 代理模式是面向对象编程中比较常见的设计模式。 这里写图片描述 这是常见代理模式常见的

黄小龙的博客 790

【电路设计实战】BUCK降压电路:从原理到PCB布局的降噪与效率优化

本文深入剖析了BUCK降压电路的工作原理,并针对其固有的开关噪声问题,提供了从核心元件选型到PCB布局的全面优化方案。文章重点探讨了电感、电容等关键元件的选型要点,强调了低ESR电容和肖特基二极管的重要性,并详细阐述了如何通过最小化功率回路、保护敏感信号线等PCB布局实战技巧,有效抑制噪声、提升效率与稳定性。

weixin_29304021的博客 223

WordPress插件depicter存在SQL注入漏洞(CVE-2025-2011)

Depicter 是一款功能强大的 WordPress 幻灯片插件,允许用户通过直观的拖放编辑器轻松创建响应式滑块、轮播和动态内容展示。该插件提供丰富的模板库、动画效果和图层控制,支持多媒体内容嵌入(如图片、视频、HTML),并优化了移动端显示和SEO性能。其无代码操作界面适合非技术用户,同时提供高级自定义选项,适用于产品展示、营销推广和视觉叙事等多种场景,是提升网站视觉吸引力的高效工具。

m0_50125527的博客 554

动态代理与静态代理区别

一、代理概念  为某个对象提供一个代理,以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。  图1:代理模式    从图中可以看出,代理接口(Subject)、代理类(ProxySubject)、委托类(RealSubject)形成一个

ikownyou的博客 2万+

AUTOSAR知识点 之 XCP (二):XCP基础概念

学习XCP的过程中,对XCP的基本概念要做一个全面的认知,因为里面有很多缩写以及难以理解的点,假设对此模模糊糊一知半解,那么对整个协议栈的认知会遇到极大的障碍。XCP的信号流传输图示如下XCP 标准主要分为 5 个部分:这部分提供了对于协议的一个概况介绍,包括 XCP 的功能和基础性内容。这部分内容对协议层进行了详细的规范和说明。

梦想技术家 2769

静态代理和动态代理的区别及命名原因

静态代理和动态代理是两种常用的代理模式,尽管它们的实现方式不同,但本质都是通过代理类控制对目标对象的访问。静态代理的代理类在编译期生成,比较简单易懂,但缺乏灵活性;而动态代理则是在运行时生成代理类,提供了更强的灵活性,适合于代理多个类或接口的场景。因此,它们被称为“静态”和“动态”主要取决于代理类的生成时机。静态代理在编译时生成,表现为“静态”;而动态代理在运行时生成,表现为“动态”。

weixin_54574094的博客 1031

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

动态代理和静态代理的区别_java静态代理与动态代理

1. 静态代理与动态代理区别静态代理:需要编写批量代理类动态代理:不需要编写批量代理类2.静态代理静态代理结构如下:编写测试接口:public interface TestInteface { /** * 测试方法 */ String runNow(String param);}//end编写测试类:public class TestProxy implements TestInteface { ...

weixin_39777497的博客 158

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java经典问题——静态代理和动态代理的区别

静态代理就是按照代理模式书写的代码,如《代理模式》一节中的示例,其特点是代理类和目标类在代码中是确定的,因此称为静态。静态代理可以在不修改目标对象功能的前提下,对目标功能进行扩展。 但是静态代理显然不够灵活,这时就需要动态代理。 动态代理也叫 JDK 代理或接口代理,有以下特点: 代理对象不需要实现接口 代理对象的生成是利用 JDK 的 API 动态的在内存中构建代理对象 能在代码运行时动态地改变某个对象的代理,并且能为代理对象动态地增加方法、增加行为 一般情况下,动态代理的底层不用我们亲自去实现,可以

Itmastergo的博客 1734

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JDK静态代理、JDK动态代理、Cglib动态代理区别

一、代理模式介绍 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。说白了经纪人懂吧,整不好就绿你的那种。 二、JDK静态代理 场景:比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理呀,然后就绿了大郎。。。 第一步:定义一种类...

Coding Farmer的博客 1481

静态代理、JDK动态代理、CGLIB动态代理以及JDK和CGLIB动态代理的区别

代理模式在 Java 开发中是一种比较常见的设计模式。设计目的旨在为服务类与客户类之间插入其他功能,插入的功能对于调用者是透明的,起到伪装控制的作用。如租房的例子: 房客、中介、房东。对应于代理模式中即:客户类、代理类 、委托类 (被代理类)为某一个对象(委托类)提供一个代理 (代理类),用来控制对这个对象的访问。委托类和代理类有个共同的父类或父接口。代理类会对请求做预处理、过滤,将请求分配给指定对象。//目标对象//通过构造器传入目标对象/*** 获取代理对象* @return*/

来都来了 1139

Java之静态代理与动态代理的区别

Java之静态代理与动态代理的区别

码海浮生,一个乐于分享的全栈工程师! 1298

动态代理和静态代理的区别

代理模式的目的是在不修改原有类方法设计的基础上,对方法行为进行增强。 为了好理解,举个实际场景,我们业务场景中经常有限流的需求,常规操作是在需要限流的接口代码前加入调用次数判断的代码,但是这样每个需要限流的方法都需要加,工作量大不说,一方面不好维护,不能很清晰的知道每个接口限流值,另一方面,限流代码和业务代码堆叠在一起,也影响代码阅读。解法是做一套统一限流,一般好点的会有专门的接口限流平台,配置对应的接口名,设置限流值,直接就可以限流,实现方式就可以用动态代理。不修改原接口的实现,对接口进行增强。 动.

weixin_43831204的博客 563

静态代理和动态代理的区别是什么

​ 相比于静态代理,动态代理在创建代理对象上更加的灵活,动态代理类的字节码在程序运行时,由Java反射机制动态产生。3、动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象。4、还有一种动态代理CGLIB,代理的是类,不需要业务类继承接口,通过派生的子类来实现代理。2、静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。...

LiZhen314的博客 2342

动态代理和静态代理的区别:

目标对象不固定,通过反射机制在应用程序执行时动态创建目标对象,代理对象会增强目标对象的行为。①JDK动态代理是Java官方提供的工具,不需要引入其它依赖;②JDK基于接口实现动态代理,要求被代理类必须实现接口;静态代理对于代理的角色是固定的,代理类和被代理类有共同的父类 ,在。动态代理的代理类是在运行时生成,需要通过反射的机制调用代理类的方法。② 静态代理的代理类在编译时就已经存在,直接调用代理类的方法;而动态代理是在运行时动态生成代理类的代码。① 静态代理是在编译时就已经确定代理类的代码;

2301_77434036的博客 491

Spring中静态代理与动态代理的实现及区别

代理模式在Java中特别常见,如spring AOP功能就是用代理来实现的。代理模式作用是:在不修改被代理对象功能的基础上,通过对代理类进行扩展,进行一些功能上的附加与增强。 一般使用代理模式我们需要先定义一个接口,静态代理只是一种简单的java代码功能扩展。而动态代理利用了反射机制,使用更简单。

weixin_43005654的博客 1990

JAVA动态代理和静态代理的区别

1.区别: 静态代理: 代理动态 2.代码练习:

zwllovewhy的博客 243

静态代理,jdk动态代理以及Cglib区别

众所周知,Spring AOP中涉及到了动态代理模式,那么有动态代理相应的就会有静态代理。那么动态代理分为哪几种,相对应的区别又是什么呢? 首先什么是代理? 找一个东西或者一个人去帮你做事,比如常说的中介就是一个代理,各大经销商的代理商等等。JAVA中的代理即是指将自己的事情委派给别人帮忙去完成。 静态代理:代理的是程序员已经创建好的类,也就是说当前仅有一个对象能被成功代理。上代码看下 首先是一个需要代理的接口类 该类描述了两个方法,一个是eat(),一个是run(); public inte

Java0258的博客 286
上一篇: 二十分钟带你速通RabbitMQ
下一篇: 手写一个简单易懂的策略模式
java烤冷面
博客等级 码龄4年 177粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值