写一个ArrayList类的代理,其内部实现和ArrayList中完全相同的功能,并可以计算每个方法运行的时间。
package com.alex.question3;
import java.io.Serializable;
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.List;
import java.util.RandomAccess;
import java.util.concurrent.TimeUnit;
public class ArrayListProxy {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List arrayListProxy = (List)Proxy.newProxyInstance(ArrayListProxy.class.getClassLoader(),
new Class[]{Serializable.class,Cloneable.class,Iterable.class,Collection.class,List.class, RandomAccess.class},
new InvocationHandler(){
ArrayList target = new ArrayList();
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
long before = System.currentTimeMillis();
TimeUnit.SECONDS.sleep(1);
Object obj = method.invoke(target, args);
long after = System.currentTimeMillis();
System.out.println("method ["+method.getName()+"] running time is :"+(after-before));
return obj;
}});
arrayListProxy.add("zhuang");
arrayListProxy.add("alex");
System.out.println("size is :"+arrayListProxy.size());
}
}
运行结果:method [add] running time is :1000
method [add] running time is :1000
method [size] running time is :1000
size is :2