利用动态代理技术增强 Collection 功能
1. 主要功能
- 对 Collection 接口进行代理;
- 以前的 remove(Object obj) 方法是删除集合中第一次出现的元素(比如集合中有多个 “abc”,调用 remove(“abc”) 后只会删除一个元素);
- 代理后,要求在调用 remove(Object obj) 方法后,能够删除集合中所有匹配的元素。
2. 代码实现
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.Collections;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
Collections.addAll(coll, "abc", "aaa", "bbb", "abc", "ccc", "abc");
Collection<String> list = (Collection<String>) Proxy.newProxyInstance(coll.getClass().getClassLoader(), coll.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String name = method.getName();
if ("remove".equals(name)) {
Iterator<String> it = coll.iterator();
while (it.hasNext()) {
if (it.next().equals(args[0])) {
it.remove();
}
}
}
return method.invoke(coll, args);
}
});
list.remove("abc");
System.out.println(coll);
}
}
原文链接:https://blog.csdn.net/Regino/article/details/105244332