黑马程序员技术交流社区
标题:
关于ArrayList类代理中的一个题目,希望可以获得技术分,谢谢!
[打印本页]
作者:
pzfpang449
时间:
2013-2-5 13:44
标题:
关于ArrayList类代理中的一个题目,希望可以获得技术分,谢谢!
要求:写一个ArrayList类的代理,
其内部实现和ArrayList中完全相同的功能,
并可以计算每个方法运行的时间。
我的解答:
package com.pzf;
import java.lang.reflect.Constructor;
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;
public class Test3 {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class clazzproxy1=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
//System.out.println(proxy1.getName());
System.out.println("-----构造方法列表-----");
//2,查看类的方法
//2.1查看构造方法
Constructor[] constructors= clazzproxy1.getConstructors();
for(Constructor constructor:constructors){
//获得构造方法的名字
String mame=constructor.getName();
StringBuilder sb=new StringBuilder(mame);
sb.append('(');
//查看方法的参数
Class[] clazzParames= constructor.getParameterTypes();
for(Class clazzParame:clazzParames ){
//取出类型名字,并且追加到StringBuilder,并且每个参数用逗号隔开
sb.append(clazzParame.getName()).append(",");
}
//去掉最后逗号
if(clazzParames!=null&&clazzParames.length!=0){
sb.deleteCharAt(sb.length()-1);
}
sb.append(')');
System.out.println(sb.toString());
}
System.out.println("----方法列表----");
Method[] methods=clazzproxy1.getMethods();
for(Method method: methods){
//获得构造方法的名字
String name=method.getName();
StringBuilder sb=new StringBuilder(name);
sb.append('(');
//查看方法的参数
Class[] clazzParames= method.getParameterTypes();
for(Class clazzParame:clazzParames){
//取出类型名字,并且追加到StringBuilder,并且每个参数用逗号隔开
sb.append(clazzParame.getName()).append(",");
}
//去掉最后逗号
if(clazzParames!=null&&clazzParames.length!=0)
sb.deleteCharAt(sb.length()-1);
sb.append(')');
System.out.println(sb.toString());
}
System.out.println("------输出时间------");
//获得有参构造方法
Constructor constructor= clazzproxy1.getConstructor(InvocationHandler.class);
//创建对象,使用匿名内部类
Collection proxy =(Collection)constructor.newInstance(new InvocationHandler(){
ArrayList target=new ArrayList();
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
//计算时间
long beginTime=System.currentTimeMillis();
Object reval= method.invoke(target, args);
long endTime=System.currentTimeMillis();
System.out.println("方法名:"+method.getName()+"--运行时间"+(endTime-beginTime));
return reval;
}
});
//使用
proxy.add("aaa");
proxy.add("bbb");
proxy.add("ccc");
}
}
复制代码
输出结果:
-----构造方法列表-----
$Proxy0(java.lang.reflect.InvocationHandler)
----方法列表----
add(java.lang.Object)
hashCode()
clear()
equals(java.lang.Object)
toString()
contains(java.lang.Object)
isEmpty()
addAll(java.util.Collection)
iterator()
size()
toArray([Ljava.lang.Object;)
toArray()
remove(java.lang.Object)
containsAll(java.util.Collection)
removeAll(java.util.Collection)
retainAll(java.util.Collection)
isProxyClass(java.lang.Class)
getProxyClass(java.lang.ClassLoader,[Ljava.lang.Class;)
getInvocationHandler(java.lang.Object)
newProxyInstance(java.lang.ClassLoader,[Ljava.lang.Class;,java.lang.reflect.InvocationHandler)
wait()
wait(long,int)
wait(long)
getClass()
notify()
notifyAll()
------输出时间------
方法名:add--运行时间1
方法名:add--运行时间0
方法名:add--运行时间0
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2