我们要测试的例子是java.util.LinkedList和java.util.ArrayList的get(intindex)方法,显然ArrayList要比LinkedList高效,因为前者是随机访问,而后者需要顺序访问。

  首先我们创建一个接口

publicinterfaceFoo{

publicvoidtestArrayList();

publicvoidtestLinkedList();

}

  然后我们创建测试对象实现这个接口

publicclassFooImplimplementsFoo{

 

privateListlink=newLinkedList();

privateListarray=newArrayList();

 

publicFooImpl()

{

for(inti=0;i<10000;i++)

{

array.add(newInteger(i));

link.add(newInteger(i));

}

}

 

publicvoidtestArrayList()

{

for(inti=0;i<10000;i++)

array.get(i);

}

 

publicvoidtestLinkedList()

{

for(inti=0;i<10000;i++)

link.get(i);

}

}

  接下来我们要做关键的一步,实现InvocationHandler接口

importjava.lang.reflect.InvocationHandler;

importjava.lang.reflect.Method;

importjava.lang.reflect.*;

publicclassHandlerimplementsInvocationHandler{

privateObjectobj;

publicHandler(Objectobj){

this.obj=obj;

}

publicstaticObjectnewInstance(Objectobj){

Objectresult=Proxy.newProxyInstance(obj.getClass().getClassLoader(),

obj.getClass().getInterfaces(),newHandler(obj));

return(result);

}

publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{

Objectresult;

try{

System.out.print("beginmethod"+method.getName()+"(");

for(inti=0;args!=null&&i<args.length;i++){

if(i>0)System.out.print(",");

System.out.print(""+

args[i].toString());

}

System.out.println(")");

longstart=System.currentTimeMillis();

result=method.invoke(obj,args);

longend=System.currentTimeMillis();

System.out.println("themethod"+method.getName()+"lasts"+(end-start)+"ms");

}catch(InvocationTargetExceptione){

throwe.getTargetException();

}catch(Exceptione){

thrownewRuntimeException

("unexpectedinvocationexception:"+

e.getMessage());

}finally{

System.out.println("endmethod"+method.getName());

}

returnresult;

}

}