首页 > 其他分享 >代理模式 - 动态代理

代理模式 - 动态代理

时间:2024-09-23 16:34:33浏览次数:10  
标签:Object getClass args list 代理 模式 Proxy 动态

动态代理的API

Proxy 动态代理类

  • 生成代理对象:Proxy.newProxyInstance( 类加载器接口数组处理器 )
    • 类加载器:对象.getClass( ).getClassLoader( )
    • 接口数组-被代理类的所有接口:被代理对象.getClass( ).getInterfaces( )
    • 处理器:代理对象调用方法时,会被处理器拦截

InvocationHandler 处理器接口

  • 处理器的作用:拦截方法的执行
  • 代理对象调用方法时,必须经过处理器的invoke( )方法

动态代理的角色分析


动态代理的模板代码


// 动态代理公式
// T t=(T)Proxy.newProxyInstance(类加载器,接口数组,处理器);


T t=(T)Proxy.newProxyInstance(
                被代理对象.getClass().getClassLoader(),
                被代理对象.getClass().getInterfaces();
                (Object obj, Method method, Object[] args)->{
                      //方法执行前
                      
                      Object result = method.invoke(代理对象,args);
                      
                      //方法执行后
      
                      return result;
                 }
);
t.接口的方法() ;

应用实例

调用List集合remove( )时,删除指定的元素(包含重复的元素)

public static void main(String[] args1) {
    //需求:调用List集合remove()时,删除指定的元素,包含多个重复的元素
    //1.创建被代理对象
    List list = new ArrayList();
    Collections.addAll(list, 2, 3, 5, 2, 7, 2, 9,5, 6);
    System.out.println("调用方法前:"+list);

    //2.通过Proxy类 创建代理对象
    List listProxy=(List) Proxy.newProxyInstance(
            list.getClass().getClassLoader(),
            list.getClass().getInterfaces(),
            (Object obj, Method method, Object[] args)->{
                Object invoke = null;//目标方法的返回值,如果没有,则不需要写
                if("remove".equals(method.getName())){
                    //调用remove方法时,删除所有指定的重复元素
                    while(true){
                        if (!list.contains(args[0])) {
                            break;
                        }
                        list.remove(args[0]);
                    }
                }else{
                    //其它方法,正常执行
                    invoke = method.invoke(list, args);
                }

                return invoke;

            }
    );
    //3.代理对象调用方法
    listProxy.remove(2);
    System.out.println("调用方法后:"+list);
}

标签:Object,getClass,args,list,代理,模式,Proxy,动态
From: https://www.cnblogs.com/meitianyouheng/p/18427281

相关文章

  • 云设计模式介绍
    云设计模式介绍以及它们如何帮助应对分布式计算的谬误   作为构建分布式系统的软件工程师,我们经常遇到诸如不可靠的网络、延迟问题和安全问题等挑战。"分布式计算的谬误"描述了如果未解决,可能导致系统故障的常见误解。但认识到这些陷阱只是开始。真正的问题是:我们如何有效地克......
  • Axure原型设计:多层级动态表格
    多层级表格又成为树形表格,是在后台常用的一种表格形式,当表格数据存在多层级关系是,可以通过多层级表格,从而更加清晰的呈现数据内容,帮助人们更好地理解和分析数据之间的关系,从而更加有效地传递信息。所以今天作者就教大家怎么在Axure里制作多层级动态表格,包括展开、折叠、增加、修......
  • 基于django+vue基于O2O模式的外卖订餐系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已渗透到人们生活的方方面面,其中外卖订餐系统作为“互联网+餐饮”的典型代表,近年来在全球范围内迅速崛......
  • MVC 架构模式
    目录MVC(Model-View-Controller)架构模式是一种软件设计模式,常用于开发用户界面,特别是Web应用程序。MVC模式将应用程序分为三个核心组件,目的是实现用户界面(UI)与业务逻辑的分离,以及提高代码的可维护性和可重用性。这三个核心组件分别是:模型(Model):模型代表了应用程序的数据层和......
  • Nginx反向代理
    前言    Nginx是互联网应用的一层网关,是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它最初是由俄罗斯的伊戈尔·赛索耶夫(IgorSysoev)在2002年开发的,目的是为了解决C10K问题(即同时处理10000个客户端连接的问题)。Nginx以其高稳定性、丰富的功......
  • [答疑]《分析模式》2020中译本翻译水平怎样
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集albert2024-9-1920:16学习了多集您做的分析模式视频,发现在比对环节2004版普遍比2020版正确。是否可以得出结论2004版本更好?我现在学习用2020版,是否需要找一个老版本,或者老师推荐一些......
  • 【C语言】动态内存管理
    目录一、为什么要动态内存分配二、malloc三、free四、calloc五、realloc六、常见动态内存分配的错误(1)解引用NULL指针(2)越界访问动态分配内存(3)用free释放非动态分配内存(4)用free释放动态分配内存的一部分(5)对同一块动态内存的多次释放(6)动态分配内存忘记释放(内存泄......
  • Qt C++设计模式->组合模式
    组合模式(CompositePattern)是一种结构型设计模式,允许你将对象组合成树形结构以表示部分与整体的层次关系。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,简化了对复杂树形结构的操作。组合模式的应用场景组合模式非常适合用于需要处理树形结构的场景,比如文件系......
  • XML映射器-动态sql
    01-动态sql1.实现动态条件SQL第一种方法在sql语句中加入where1=1其他条件都加and就行,这样就可以根据if条件来判断要传递的参数可以有几个第二种方法用where标签给if语句包起来where标签的作用如下图第三种方法用trim标签解释如下图用choose也可以实现条件查询......
  • 【通俗易懂介绍OAuth2.0协议以及4种授权模式】
    文章目录一.OAuth2.0协议介绍二.设计来源于生活三.关于令牌与密码的区别四.应用场景五.接下来分别简单介绍下四种授权模式吧1.客户端模式1.1介绍1.2适用场景1.3时序图2.密码模式2.1介绍2.2适用场景2.3时序图3.授权码模式3.1介绍3.2适用场景3.3时序图4.简化模......