对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);
}
}