代理模式 - 动态代理
  ZTo294hNoDcA 3小时前 6 0

动态代理的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);
}

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 3小时前 0

暂无评论

推荐阅读
  mgo1fSDRePpT   3小时前   7   0   0 Java
  3dygdw7fVgD7   3小时前   6   0   0 Java
  mgo1fSDRePpT   3天前   17   0   0 Java
  ukiVIBTK2zBw   3天前   17   0   0 Java
ZTo294hNoDcA
作者其他文章 更多

2024-09-20

2024-09-16

2024-09-13

2024-09-12

2024-09-12

2024-09-10