ArrayList类的代理,其内部实现和ArrayList中完全相同的功能并计算每个方法运行时间。


需求: 写一个ArrayList类的代理,其内部实现和ArrayList中完全相同的功能,

        并可以计算每个方法运行的时间。

// 代理类

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;


public class ProxyDemo1 {

    public static void main(String[] args) throws  Exception
    {
        
        Class clazz =Proxy.getProxyClass
        (Collection.class.getClassLoader(),Collection.class);
        System.out.println(clazz.getName());
        
        //获得Proxy 的构造方法。
        Constructor[] constructors = clazz.getConstructors();
        for(Constructor  constructor: constructors)
        {
            String name=constructor.getName();
            StringBuilder sBuilder = new StringBuilder(name);
            sBuilder.append('(');
            Class [] clazzParams = constructor.getParameterTypes();
            for(Class clazzParam:  clazzParams)
            {
                sBuilder.append(clazzParam.getName()).append(',');
            }
            if(clazzParams!=null&&clazzParams.length!=0)
                sBuilder.deleteCharAt(sBuilder.length()-1);
            sBuilder.append(')');
            System.out.println(sBuilder.toString()+"---------");//看看方法名字。
        }
    
    // 给我一个目标,给我一个系统功能,我就返回一个代理,那代理就会调用目标对象,并且目标对象会执行系统功能。
        final    ArrayList  target =new ArrayList();
        Collection proxy3 = (Collection)getProxy(target,new MyAdvice());
        
    // 每调用一次add 都会调用一次InvocationHandler的invoke方法,代理对象,代理对象的方法,代理对象的方法参数这三要素传递给invoke。
        proxy3.add("zxx");
        proxy3.add("bxd");
        proxy3.add("lhm");
        System.out.println(proxy3.size());
    }
    //不仅要对集合进行,对其他对象都能封装。将集合换成任意对象。即将目标和系统功能都封装成对象。
    private static Object getProxy(final Object target,final Advice advice) //内部类成员访问局部变量 需要final。
    {
        Object  proxy3 = Proxy.newProxyInstance(
                target.getClass().getClassLoader(), // 将目标抽取成一个对象。
                //new Class[]{Collection.class},
                target.getClass().getInterfaces(),
                new InvocationHandler(){
                    
                    public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
                        
                        advice.beforeMethod(method);
                        Object retVal = method.invoke(target, args);
                        advice.afterMethod(method);
                        
                        return retVal;
                }
                
        });
        return proxy3;
    }
}

//  目标功能类

import java.lang.reflect.Method;
public class MyAdvice implements Advice{

        long  beginTime =0;
        
        public void beforeMethod(Method method) {
            
            System.out.println("方法前");
            beginTime =System.currentTimeMillis();    
            System.out.println(method.getName());
        }
        public void afterMethod(Method method) {
            

            System.out.println("方法后 ");
            long endTime2  =System.currentTimeMillis();
            System.out.println(method.getName()+":运行时间:"+(endTime2-beginTime));
        }
}

// Advice 接口

import java.lang.reflect.Method;

// 系统功能类名,也是忠告。
public interface Advice {

     void beforeMethod (Method method);
     void  afterMethod (Method method);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值