对Collection接口进行代理:以前的remove(Object obj)方法是删除集合中第一次出现的元素(比如集合中有多个“abc”,调用remove(“abc”)后只会删除一个元素)。代理后,要求在调用remove(Object obj)方法后,能够删除集合中所有匹配的元素。【动态代理】
废话不多说,上代码:
package com.DynamicAgent;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* @Author: Mr.Xu
* @description: 动态代理,对Collection接口进行代理,增强remove方法
* @Date: 2021/10/7 11:59
*/
//对Collection接口进行代理,以前的remove(Object obj)方法是删除集合中第一次出现的元素
// (比如集合中有多个“abc”,调用remove(“abc”)后只会删除一个元素)。代理后,
// 要求在调用remove(Object obj)方法后,能够删除集合中所有匹配的元素。【动态代理】
public class Test {
public static void main(String[] args) {
//创建一个集合
ArrayList<String> str = new ArrayList<>();
//将数据存入集合
str.add("acc");
str.add("acc");
str.add("abc");
str.add("acc");
str.add("asc");
str.add("adc");
str.add("acc");
// 删除前
System.out.println(str); //[acc, acc, abc, acc, asc, adc, acc]
//获取被代理类的类加载全部
ClassLoader classLoader = str.getClass().getClassLoader();
//被代理类实现所有接口的class对象
Class<?>[] interfaces = str.getClass().getInterfaces();
//事件处理接口对象
InvocationHandler ih = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//通过反射执行一下代理对象调用的方法,可以确定调用方法的返回值类型
Object in = method.invoke(str, args);
//判断调用的是否是remove方法
if (method.getName().equals("remove")){
//定义变量作为返回值
boolean flag = false;
//获取迭代器对象
Iterator<String> it = str.iterator();
//获取迭代器元素
while (it.hasNext()) {
//获取元素
String s = it.next();
//判断元素是否是需要删除的元素
if (s.equals(args[0])){
it.remove();
flag = true;
}
}
return flag;
}
return in;
}
};
//调用动态代理对象,向下转型,传入三个参数
Collection<String> proxy = (Collection<String>)Proxy.newProxyInstance(classLoader,interfaces,ih);
//执行删除操作
boolean acc = proxy.remove("acc");
System.out.println(acc);
System.out.println(str);
//调用其他方法测试 获取集合长度
int s = proxy.size();
System.out.println(s);
/*
//没有代理的情况下删除
System.out.println(str.remove("acc"));
System.out.println(str);
*/
}
}
如有不足请积极指正,谢谢!