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

静态代理与动态代理区别?

静态代理和动态代理是Java中常用的两种代理模式,用于为目标对象提供额外的功能。以下是它们的主要区别:

静态代理

  1. 代理类在编译时确定

    • 静态代理类在编译时就已经存在,并且需要手动编写。
  2. 代理类和目标类实现相同的接口

    • 代理类和被代理的目标类都需要实现相同的接口。
  3. 实现较为简单

    • 由于是手动编写代理类,结构清晰,适合简单的场景。
  4. 不易维护

    • 如果接口方法较多,代理类需要实现所有方法,这会增加代码量和维护成本。
  5. 性能较好

    • 因为代理类是编译时生成的,所以在运行时的性能开销较低。

动态代理

  1. 代理类在运行时生成

    • 动态代理类是在程序运行时通过反射机制动态生成的。
  2. 可以代理任意接口

    • 只需要一个InvocationHandler接口就可以代理任意接口的实现类。
  3. 实现较为复杂

    • 动态代理依赖于Java反射机制,代码相对复杂一些,但更灵活。
  4. 易于维护

    • 因为不需要为每个接口手动编写代理类,所以代码量较少,维护成本较低。
  5. 性能开销

    • 因为动态代理使用了反射机制,在运行时会有一定的性能开销。

示例代码

静态代理示例
public interface Subject {void request();
}public class RealSubject implements Subject {public void request() {System.out.println("RealSubject request");}
}public class StaticProxy implements Subject {private RealSubject realSubject;public StaticProxy(RealSubject realSubject) {this.realSubject = realSubject;}public void request() {System.out.println("StaticProxy before request");realSubject.request();System.out.println("StaticProxy after request");}
}public class Client {public static void main(String[] args) {RealSubject realSubject = new RealSubject();StaticProxy proxy = new StaticProxy(realSubject);proxy.request();}
}
动态代理示例
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public interface Subject {void request();
}public class RealSubject implements Subject {public void request() {System.out.println("RealSubject request");}
}public class DynamicProxyHandler implements InvocationHandler {private Object realSubject;public DynamicProxyHandler(Object realSubject) {this.realSubject = realSubject;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("DynamicProxy before request");Object result = method.invoke(realSubject, args);System.out.println("DynamicProxy after request");return result;}
}public class Client {public static void main(String[] args) {RealSubject realSubject = new RealSubject();InvocationHandler handler = new DynamicProxyHandler(realSubject);Subject proxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), new Class[]{Subject.class}, handler);proxy.request();}
}

静态代理和动态代理各有优缺点,选择哪种方式取决于具体的使用场景和需求。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 记一次Mysql8.0使用GROUP BY查询导致异常问题
  • 供应链安全:黑客攻击 Nimble 包
  • 【LeetCode】133.克隆图
  • C#中常用集合类型
  • 室内宠物空气净化器哪个好?排名靠前室内宠物空气净化器使用感受
  • 详解Xilinx FPGA高速串行收发器GTX/GTP(3)--GTX的时钟架构
  • 白骑士的PyCharm教学高级篇 3.2 多模块项目管理
  • 谷粒商城实战笔记-129-商城业务-商品上架-nested数据类型场景
  • 用Java构建简单ATM系统
  • 白骑士的PyCharm教学进阶篇 2.5 数据库连接与管理
  • 基于深度学习的大规模模型训练
  • 无代码开发AI服务 - 利用向量库Kendra和Llama大模型在亚马逊云科技AWS上创建RAG知识库
  • 基于Qt的视频剪辑
  • informer中的WorkQueue机制的实现分析与源码解读(1)
  • Netty的几种IO模式的实现与切换
  • [译]Python中的类属性与实例属性的区别
  • 【comparator, comparable】小总结
  • 30天自制操作系统-2
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Git 使用集
  • Java精华积累:初学者都应该搞懂的问题
  • SQLServer之索引简介
  • Wamp集成环境 添加PHP的新版本
  • 不上全站https的网站你们就等着被恶心死吧
  • 类orAPI - 收藏集 - 掘金
  • 前端技术周刊 2019-02-11 Serverless
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​iOS安全加固方法及实现
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 达梦数据库知识点
  • ### RabbitMQ五种工作模式:
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)IOS中获取各种文件的目录路径的方法
  • (转载)Linux 多线程条件变量同步
  • (自用)仿写程序
  • .bat批处理出现中文乱码的情况
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .Net 8.0 新的变化
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net IE10 _doPostBack 未定义
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET委托:一个关于C#的睡前故事
  • .NET未来路在何方?
  • ;号自动换行
  • @Validated和@Valid校验参数区别
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [20150629]简单的加密连接.txt
  • [20180224]expdp query 写法问题.txt