由于动态代理是面向接口实现的,然而我们要实现ArrayList类的全部代理,如果用Collection
是不可能实现的,因为Collection定义有的方法只是ArrayList的部分方法.那么我们就得自定义
一个接口MyArrayListInterface了,这个接口继承ArrayList实现的全部接口同时定义ArrayList自有的方法,同时还要自己定义一个MyArrayList类,这个类实现MyArrayListInterface接口同时继承ArrayList.这样我们就可以面向MyArrayListInterface接口的代理实现了,在代理内部使用我们自定MyArrayList
对象.这样我们实现的代理就可以实现ArrayList的全部功能方法了
// ArraiList代理类的测试
public static void main(String[] ages) {
MyArrayListInterface myArrayList =ArrayListProxy.getArrayListProxy();
myArrayList.add("AAAAA");
System.out.println(myArrayList);
}
// 定义一个ArrayList的代理类
static class ArrayListProxy {
// 定义一个返回ArrayListProxy对象的方法
public static MyArrayListInterface getArrayListProxy() {
MyArrayListInterface myArrayListProxy = (MyArrayListInterface) Proxy
.newProxyInstance(MyArrayListInterface.class
.getClassLoader(),
new Class[] { MyArrayListInterface.class },
new InvocationHandler() {
// 定义一个MyArrayList对象
private List myArrayList = new MyArrayList();
public Object invoke(Object proxy,
Method method, Object[] args)
throws Throwable {
// 定义记住此时时间的变量
long start = System.currentTimeMillis();
// 执行al的对应方法
Object objReturn = method.invoke(
myArrayList, args);
// 输出被调用方法执行的所需时间
System.out.println(method.getName()+"方法运行时间:"+(System
.currentTimeMillis()
- start)+"毫秒");
return objReturn;// 返回被调用方法执行结果
}
});
return myArrayListProxy;
}
}
}
// 定义一个实现MyArrayListInterface的类MyArrayList同时继承ArrayList
class MyArrayList extends ArrayList implements MyArrayListInterface {
}
// 定义一个接口,同时继承ArrayList类实现的全部接口,定义ArrayList独有的方法
interface MyArrayListInterfaceextends Serializable, Cloneable, Iterable ,
Collection, List , RandomAccess {
public void ensureCapacity(int minCapacity);
}
jdk的动态代理,只能面向接口,不能面向类。
如果你要面向类的代理,可以使用cglib。
你随便写个类,继承ArrayList 不就可以了 ?
抄ArrayList的源码。