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

请解释Java中的代理模式,分别介绍静态代理和动态代理

请解释Java中的代理模式,分别介绍静态代理和动态代理

代理模式是一种常见的设计模式,它允许一个对象(代理对象)代表另一个对象(被代理对象)进行访问控制,以控制对对象的访问。代理模式可以在不改变原始对象的情况下,增加额外的功能或控制访问。

  1. 静态代理:
    静态代理是在编译时确定代理关系,即代理类和被代理类的关系在编译时已经确定,代理类是直接实现了与被代理类相同的接口或者继承了与被代理类相同的父类。

特点:
静态代理在编译时确定代理关系,因此代理类的代码是固定的,不会在运行时改变。
代理类需要显式地调用被代理对象的方法,在代理对象的方法中可以添加额外的逻辑。
示例:

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

// 实现被代理类
class RealSubject implements Subject {
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

// 实现代理类
class Proxy implements Subject {
    private RealSubject realSubject;

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

    public void request() {
        System.out.println("Proxy: Handling request.");
        realSubject.request(); // 调用被代理对象的方法
    }
}

// 使用静态代理
public class StaticProxyDemo {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Proxy proxy = new Proxy(realSubject);
        proxy.request();
    }
}
  1. 动态代理:
    动态代理是在运行时生成代理类,代理类不是在编译时确定的,而是根据被代理的接口或者父类在运行时动态生成的。

特点:
动态代理不需要显式地实现被代理类的接口或者继承被代理类的父类,而是通过 Java 提供的代理类和反射机制来动态生成代理类。
动态代理可以在运行时根据需要代理不同的对象,因此更加灵活。
示例:

import java.lang.reflect.*;

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

// 实现被代理类
class RealSubject implements Subject {
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

// 使用动态代理
public class DynamicProxyDemo {
    public static void main(String[] args) {
        Subject realSubject = new RealSubject();
        Subject proxy = (Subject) Proxy.newProxyInstance(
            Subject.class.getClassLoader(),
            new Class[] { Subject.class },
            new InvocationHandler() {
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("Dynamic Proxy: Handling request.");
                    return method.invoke(realSubject, args);
                }
            }
        );
        proxy.request();
    }
}
  1. 区别和应用场景:
    静态代理:在编译时就已经确定了代理关系,代理类和被代理类之间的关系是固定的。适用于代理类数量较少、代理逻辑不变的情况。
    动态代理:在运行时动态生成代理类,代理类的生成过程由程序自动生成,更加灵活。适用于代理类数量较多、代理逻辑可能变化的情况。
    总的来说,静态代理和动态代理都是代理模式的实现方式,它们在不同的场景下有不同的应用。

http://www.kler.cn/news/234649.html

相关文章:

  • WindowsLinuxmeterepreter渗透命令回顾
  • windows 下安装gin
  • PKI - 借助Nginx实现_客户端使用CA根证书签发客户端证书
  • django中实现适配器模式
  • python基于flask的网上订餐系统769b9-django+vue
  • SNMP(简单网络管理协议)介绍
  • 【每日一题】04最小路径和 (DP3)
  • 【C语言】(20)动态内存分配
  • HiveQL——不借助任何外表,产生连续数值
  • Linux CentOS stream 9 alias
  • 【JavaScript 漫游】【014】正则表达式通关
  • VitePress-14- 配置-titleTemplate 的作用详解
  • 2.11学习总结
  • Redisson分布式锁 原理 + 运用 记录
  • CentOS基于volatility2的内存取证实验
  • bcdedit /store 填什么,Windows11的BCD文件在哪里?
  • CrossOver虚拟机软件功能相似的软件
  • 6.JavaScript中赋值运算符,自增运算符,比较运算符,逻辑运算符
  • 深入理解 Nginx 插件及功能优化指南
  • 绕过安全狗优化
  • 力扣_字符串5—解码方法
  • 吹响AI PC号角!微软在Windows中不断增加“Copilot含量”
  • 【Spring学习】Spring Data Redis:RedisTemplate、Repository、Cache注解
  • Java字符串(包含字母和数字)通用排序
  • 【MySQL】-15 MySQL综合-1(数据库概念+数据库涉及技术)
  • 【数据结构】13:表达式转换(中缀表达式转成后缀表达式)
  • 【Java】悲观锁和乐观锁有什么区别?
  • 【java】笔记10:类与对象——本章练习
  • Leetcode 3033. Modify the Matrix
  • Spring + Tomcat项目中nacos配置中文乱码问题解决