写一个ArrayList类的代理,其内部实现和ArrayList中完全相同的功能,并可以计算每个方法运行的时间。

2024-12-14 19:00:22
推荐回答(3个)
回答1:

解题思路:由于动态代理是面向接口实现的,然而我们要实现ArrayList类的全部代理,如果用Collection
 是不可能实现的,因为Collection定义有的方法只是ArrayList的部分方法.那么我们就得自定义
  一个接口MyArrayListInterface了,这个接口继承ArrayList实现的全部接口,同时还要自己定义
 一个MyArrayList类,这个类实现MyArrayListInterface接口同时继承ArrayList.这样我们就
可以面向MyArrayListInterface接口的代理实现了,在代理内部使用我们自定义的MyArrayList
对象.这样我们实现的代理就可以实现ArrayList的全部功能方法了

 public class Test2 {
 // ArraiList代理类的测试
 public static void main(String[] ages) {
  MyArrayListInterface myArrayList =ArrayListProxy.getArrayListProxy();
  myArrayList.add("AAAAA");
  System.out.println(myArrayList.get(0));
 }
 // 定义一个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
class MyArrayList extends ArrayList implements MyArrayListInterface {
}
// 定义一个接口,同时继承ArrayList类实现的全部接口
interface MyArrayListInterface extends Serializable, Cloneable, Iterable,
  Collection, List, RandomAccess {
}

回答2:

不用那么麻烦 写个类继承java.util.AbstractList 然后直接调用父类的方法 前面加上时间 后面计算下就ok了
long bt = 当前时间
super.add(E);
long et = 结束时间
算出差。
要完整一点的就是extends AbstractList implements List ,RandomAccess, Cloneable, Serializable

回答3:

ArrayList类的代理 是什么意思?
不是直接调用ArrayList吗?
我对这个很有兴趣,可以把你的问题描述清楚吗