A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

要求:写一个ArrayList类的代理,
      其内部实现和ArrayList中完全相同的功能,
      并可以计算每个方法运行的时间。
我的解答:
  1. package com.pzf;

  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Proxy;
  6. import java.util.ArrayList;
  7. import java.util.Collection;
  8. import java.util.List;

  9. public class Test3 {

  10.         /**
  11.          * @param args
  12.          */
  13.         public static void main(String[] args) throws Exception {
  14.                 // TODO Auto-generated method stub
  15.                 Class clazzproxy1=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
  16.                 //System.out.println(proxy1.getName());
  17.                 System.out.println("-----构造方法列表-----");
  18.                 //2,查看类的方法
  19.                 //2.1查看构造方法
  20.                 Constructor[] constructors= clazzproxy1.getConstructors();
  21.                 for(Constructor constructor:constructors){
  22.                         //获得构造方法的名字
  23.                         String mame=constructor.getName();
  24.                         StringBuilder sb=new StringBuilder(mame);
  25.                         sb.append('(');
  26.                         //查看方法的参数
  27.                         Class[] clazzParames= constructor.getParameterTypes();
  28.                         for(Class clazzParame:clazzParames ){
  29.                                 //取出类型名字,并且追加到StringBuilder,并且每个参数用逗号隔开
  30.                                 sb.append(clazzParame.getName()).append(",");
  31.                         }
  32.                         //去掉最后逗号
  33.                         if(clazzParames!=null&&clazzParames.length!=0){
  34.                                 sb.deleteCharAt(sb.length()-1);
  35.                         }
  36.                         sb.append(')');
  37.                         System.out.println(sb.toString());
  38.                        
  39.                 }
  40.                 System.out.println("----方法列表----");
  41.                 Method[] methods=clazzproxy1.getMethods();
  42.                 for(Method method: methods){
  43.                         //获得构造方法的名字
  44.                         String name=method.getName();
  45.                         StringBuilder sb=new StringBuilder(name);
  46.                         sb.append('(');
  47.                         //查看方法的参数
  48.                         Class[] clazzParames= method.getParameterTypes();
  49.                         for(Class clazzParame:clazzParames){
  50.                                 //取出类型名字,并且追加到StringBuilder,并且每个参数用逗号隔开
  51.                                 sb.append(clazzParame.getName()).append(",");
  52.                                
  53.                        
  54.                         }
  55.                         //去掉最后逗号
  56.                         if(clazzParames!=null&&clazzParames.length!=0)
  57.                                 sb.deleteCharAt(sb.length()-1);
  58.                         sb.append(')');
  59.                         System.out.println(sb.toString());
  60.                
  61.                        
  62.                        
  63.                 }
  64.                 System.out.println("------输出时间------");
  65.                 //获得有参构造方法
  66.                 Constructor constructor= clazzproxy1.getConstructor(InvocationHandler.class);
  67.                 //创建对象,使用匿名内部类
  68.          Collection proxy        =(Collection)constructor.newInstance(new InvocationHandler(){
  69.                         
  70.                         ArrayList  target=new ArrayList();
  71.                         @Override
  72.                         public Object invoke(Object proxy, Method method, Object[] args)
  73.                                         throws Throwable {
  74.                                 // TODO Auto-generated method stub
  75.                                 //计算时间
  76.                                 long beginTime=System.currentTimeMillis();
  77.                                 Object reval= method.invoke(target, args);
  78.                                 long endTime=System.currentTimeMillis();
  79.                                 System.out.println("方法名:"+method.getName()+"--运行时间"+(endTime-beginTime));
  80.                                 return reval;
  81.                         }
  82.                        
  83.                 });
  84.                  //使用
  85.                 proxy.add("aaa");
  86.                 proxy.add("bbb");
  87.                 proxy.add("ccc");
  88.                
  89.                
  90.         }

  91. }
复制代码
输出结果:

-----构造方法列表-----
$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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马