- package com.itheima;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 第4题:写一个ArrayList类的代理,实现和ArrayList中完全相同的功能,并可以计算每个方法运行的时间。
- *
- * @author hp-pc
- * */
- public class Test4
- {
- @SuppressWarnings("unchecked")
- public static void main(String[] args)
- {
- @SuppressWarnings("rawtypes")
- // new一个final类型的list集合
- final ArrayList target = new ArrayList();
- @SuppressWarnings("rawtypes")
- /*
- * 创建一个动态代理类实例 第一个参数:定义代理类的类加载器; 第二个参数:代理类要实现的接口列表; 第三个参数:指派方法调用的调用处理程序
- */
- List proxy = (List) Proxy.newProxyInstance(List.class.getClassLoader(),
- ArrayList.class.getInterfaces(), new InvocationHandler()
- {
- @Override
- // 在代理实例上处理方法调用并返回结果
- public Object invoke(Object proxy, Method method,
- Object[] args) throws Throwable
- {
- //开始时间
- long beginTime = System.currentTimeMillis();
- //让进程暂停执行10毫秒,为了更明显的显示运行时间
- Thread.sleep(10);
- Object reVal = method.invoke(target, args);
- //结束时间
- long endTime = System.currentTimeMillis();
- System.out.println(method.getName()
- + " running time is " + (endTime - beginTime)
- + "毫秒");
- return reVal;
- }
- });
- /*
- * 运行结果
- * add running time is 10毫秒
- * add running time is 11毫秒
- * add running time is 10毫秒
- * add running time is 10毫秒
- * remove running time is 11毫秒
- */
- //通过方法向对象中增加字符串对象
- proxy.add("gaozhihao");
- proxy.add("gaozhihao");
- proxy.add("gaozhihao");
- proxy.add("heima");
- proxy.remove("heima");
- }
- }
复制代码 |
|