首页 > 其他分享 >静态代理与动态代理区别?

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

时间:2024-08-05 10:25:10浏览次数:11  
标签:静态 RealSubject request 代理 realSubject 动态 public Subject

静态代理和动态代理是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;
    }

    @Override
    public 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();
    }
}

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

标签:静态,RealSubject,request,代理,realSubject,动态,public,Subject
From: https://blog.csdn.net/Gemini1995/article/details/140917601

相关文章

  • wsl 配置centos8静态ip的几种方法
    方法1:安装systemd-networkdsudodnfinstallsystemd-networkdifconfig查看要修改的网络,然后启动服务:sudosystemctlenable--nowsystemd-networkd在/etc/systemd/network/目录下创建文件eth0.network来配置eth0接口[Match]Name=eth0[Network]Address=1......
  • 动态规划,蒙特卡洛,TD,Qlearing,Sars,DQN,REINFORCE算法对比
    动态规划(DynamicProgramming,DP)通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划的步骤识别子问题:定义问题的递归解法,识别状态和选择。确定DP数组:确定存储子问题解的数据结构,通常是数组或矩阵。确定状态转移方程:找出状态之间的关系,即状态转移方程。......
  • go-zero微服务框架的静态文件服务
    目录go-zero微服务框架的静态文件服务应用场景go-zero版本新建项目目录新建demo.api文件生成api代码新建静态1.html文件查看文件目录写入静态服务代码启动api服务访问1.html参考文档go-zero微服务框架的静态文件服务应用场景通过go-zero的rest.WithFileServer("/public",......
  • Go 静态编译及在构建 docker 镜像时的应用
    Go语言具有跨平台和可移植的特点,同时还支持交叉编译,可以在一个系统上编译出运行在另一个系统上的二进制可执行文件,这是因为Go在编译时支持将依赖的库文件与源代码一起编译链接到二进制文件中,所以在实际运行时不再需要依赖运行环境中的库,而只需要一个二进制文件就可以运行,在构建......
  • 用静态工厂方法代替构造器
    静态工厂方法就是让类提供一个公用的静态工厂方法,根据该方法来返回一个实例对象例如Boolean中的valueof方法:publicfinalclassBooleanimplementsjava.io.Serializable,Comparable<Boolean>{/***The{@codeBoolean......
  • 静态路由的配置和实验
    简介:静态路由是一种需要管理员手工配置的特殊路由.静态路由比动态路由使用更少的带宽.并且不占用CPU资源来计算和更新路由.但是当网络发生故障或者拓扑发生变化后.静态路由不会自动更新.必须手动重新配置.静态路由有5个主要参数:目的地址和掩码.出接口和下一跳.优先级使用静态......
  • Day 32 动态规划 Part01
    动态规划解题步骤确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组509.斐波那契数显然dp[i]代表fib[i],fib[i]=fib[i-1]+fib[i-2],fib[0]=0,fib[1]=1,遍历从前往后遍历即可。下面的代码优化了空间复杂度,但思路是一致的。......
  • web部署时通过静态文件配置请求地址
    web部署动态更改请求地址通过访问根目录config配置实现在打包文件外部更改请求地址1.配置ViteexportdefaultdefineConfig({base:'/',//设置公共路径})2.创建配置文件开发:在根目录创建config.json文件不影响proxy代理{"apiBaseUrl":"/"}部署在d......
  • 【002】Linux配置静态ip地址
    一、环境虚拟机版本:VMwareLinux镜像文件:CentOS-7-x86_64-Minimal-2207-02.iso主机系统:Windows11家庭中文版主机系统类型:64位操作系统,基于x64的处理器远程连接工具:宝塔远程工具二、配置静态ip1、将虚拟机的网络模式设置为NAT模式2、设置VMware的网络模式选择VM......
  • 解密动态规划:简单易懂的方法和分类大揭秘
    动态规划是一种解决问题的算法思想,它通过将问题划分成多个子问题并进行递推求解,从而得到最优解。以下是简单易懂的动态规划方法以及动态规划的分类:简单易懂的动态规划方法:确定状态:分析问题,找出问题的关键参数,并将其抽象为状态。确定状态转移方程:确定状态之间的关系,即如何从......