代理模式 - 动态代理

打印 上一主题 下一主题

主题 829|帖子 829|积分 2487

动态代理的API


Proxy 动态代理类


  • 生成代理对象:Proxy.newProxyInstance( 类加载器接口数组处理器 )

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

InvocationHandler 处理器接口


  • 处理器的作用:拦截方法的执行
  • 代理对象调用方法时,必须颠末处理器的invoke( )方法
动态代理的角色分析


动态代理的模板代码
  1. // 动态代理公式
  2. // T t=(T)Proxy.newProxyInstance(类加载器,接口数组,处理器);
  3. T t=(T)Proxy.newProxyInstance(
  4.                 被代理对象.getClass().getClassLoader(),
  5.                 被代理对象.getClass().getInterfaces();
  6.                 (Object obj, Method method, Object[] args)->{
  7.                       //方法执行前
  8.                      
  9.                       Object result = method.invoke(代理对象,args);
  10.                      
  11.                       //方法执行后
  12.       
  13.                       return result;
  14.                  }
  15. );
  16. t.接口的方法() ;
复制代码
应用实例

调用List聚集remove( )时,删除指定的元素(包含重复的元素)
  1. public static void main(String[] args1) {
  2.     //需求:调用List集合remove()时,删除指定的元素,包含多个重复的元素
  3.     //1.创建被代理对象
  4.     List list = new ArrayList();
  5.     Collections.addAll(list, 2, 3, 5, 2, 7, 2, 9,5, 6);
  6.     System.out.println("调用方法前:"+list);
  7.     //2.通过Proxy类 创建代理对象
  8.     List listProxy=(List) Proxy.newProxyInstance(
  9.             list.getClass().getClassLoader(),
  10.             list.getClass().getInterfaces(),
  11.             (Object obj, Method method, Object[] args)->{
  12.                 Object invoke = null;//目标方法的返回值,如果没有,则不需要写
  13.                 if("remove".equals(method.getName())){
  14.                     //调用remove方法时,删除所有指定的重复元素
  15.                     while(true){
  16.                         if (!list.contains(args[0])) {
  17.                             break;
  18.                         }
  19.                         list.remove(args[0]);
  20.                     }
  21.                 }else{
  22.                     //其它方法,正常执行
  23.                     invoke = method.invoke(list, args);
  24.                 }
  25.                 return invoke;
  26.             }
  27.     );
  28.     //3.代理对象调用方法
  29.     listProxy.remove(2);
  30.     System.out.println("调用方法后:"+list);
  31. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表