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

对Collection接口的子类ArrayList进行代理,以前的remove(Object obj)方法是删除集合中第一次出现的元素(比如集合中有多个“abc”,调用remove(“abc”)后只会

对Collection接口的子类ArrayList进行代理,以前的remove(Object obj)方法是删除集合中第一次出现的元素(比如集合中有多个“abc”,调用remove(“abc”)后只会删除一个元素)。代理后,要求在调用remove(Object obj)方法后,能够删除集合中所有匹配的元素【动态代理】

public class Test {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        Class<? extends ArrayList> aClass = arrayList.getClass();

        InvocationHandlerImpl ilist = new InvocationHandlerImpl(arrayList);
        Object o = Proxy.newProxyInstance(aClass.getClassLoader(), aClass.getInterfaces(), ilist);
        List list = (List) o;
        list.add("2333");
        list.add("2333");
        list.add("2333");
        list.add("2333");
        System.out.println(list);
        System.out.println(list.remove("2333"));
        System.out.println(list);
    }
}

class InvocationHandlerImpl implements InvocationHandler {
    ArrayList<? extends Object> arrayList;
    public InvocationHandlerImpl(ArrayList<? extends Object> arrayList) {
        this.arrayList = arrayList;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (method.getName().equals("remove")) {
            Iterator<? extends Object> iterator = arrayList.iterator();
            int count = 0;
            while (iterator.hasNext()) {
                if (iterator.next() == args[0]) {
                    iterator.remove();
                    count++;
                }
            }
            return String.valueOf(count).matches("[^0]");
        }
        return method.invoke(arrayList,args);
    }
}

相关文章:

  • liunx7系统centos6.8版本编译安装php7
  • 如果ngxin不能使用service nginx start 开启
  • linux7下centos6.8开启某个端口
  • liunx7下centos6.8编译安装nginx1.12.1
  • liunx7下centos6.8编译安装mysql-5.7.18
  • 关于linux下查看磁盘,内容,CPU使用情况的命令
  • Linux系统IO分析工具之iotop参数详解(查看IO占用)
  • 正则表达式之完全体验
  • 安装libpng提示--configure: error: ZLib not installed
  • WINDOWS之端口和进程查看命令
  • 3种方法轻松处理php开发中emoji表情的问题
  • linux下升级openssl到新版本
  • linux7下centos6.8版本完全编译php7.17与nginx
  • linux7下centos6.8版本完全编译php7.17与nginx --后续,配置nginx.conf与php-fpm.conf,www.conf
  • jquery将serializeArray转为可用的json对象
  • 【Leetcode】104. 二叉树的最大深度
  • 2017前端实习生面试总结
  • Android系统模拟器绘制实现概述
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • DOM的那些事
  • echarts的各种常用效果展示
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • gulp 教程
  • iOS 系统授权开发
  • Java方法详解
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Vultr 教程目录
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 从零搭建Koa2 Server
  • 对超线程几个不同角度的解释
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端学习笔记之观察者模式
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • ​力扣解法汇总946-验证栈序列
  • # 计算机视觉入门
  • #QT(TCP网络编程-服务端)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (27)4.8 习题课
  • (k8s中)docker netty OOM问题记录
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (六)软件测试分工
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • .net core 连接数据库,通过数据库生成Modell
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Micro Framework初体验
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • /etc/shadow字段详解
  • @Not - Empty-Null-Blank
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [C++]18:set和map的使用