动态代理模式--自定义数据源的终极…

动态代理模式;实现方式有两种:反射包中的Proxy类,被代理的类必须实现接口,  CGLIB第三方类库;

今天我们要讨论的是用Proxy类实现动态代理,首先我们队Proxy类做一个入门:

Class subHandler = Proxy.getProxyClass(Map.class.getClassLoader(),
    Map.class); 这段代码的意思是,告诉虚拟机你帮我动态的生成一个类,并且实现Map接口,使用Map.class的类装载器进行装载动态生成的类

那么也就是说,我们或得的是一个实现了Map接口的类对象对应的字节码文件对象;

这就是算是一个入门吧,Proxy身上有一个动态产生代理对象的静态方法的newProxyInstance();他需要三个参数,前两个和上面的方法一样,第三个参数是一个InvocationHandler;这是一个处理代理请求的类,为代理类和目标类进行牵线搭桥;

好了我们这里牵扯出了三个概念:

1 目标类:就是说哪个类要被代理;

2 代理类,为目标类服务的类,就是代理类;

3 代理请求处理类,将目标类和代理类联系起来.


public static void testCollectionProxy() {
   final ArrayList list = new ArrayList();
   Collection collection = (Collection) Proxy.newProxyInstance(
    Collection.class.getClassLoader(),
    new Class[] { Collection.class }, new InvocationHandler() {
     @Override
     public Object invoke(Object proxy, Method method,
       Object[] args) throws Throwable {
      long beginTime = System.currentTimeMillis();
      Object reVal=null;
      if("add".equals(method.getName()))
       reVal = method.invoke(list, args);
      long endTime = System.currentTimeMillis();
      System.out.println("run time "+(endTime-beginTime));
      
      if (reVal==null)
       return 2;
      else
       return reVal;
     }
    });
  collection.add("dfa");
  collection.add("daf");
  collection.add("dfafds");
  collection.size();
  collection.clear();
 }
在我们获取到的代理对象,调用代理对象的方法时,InvocationHandler都会对调用的方法进行拦截,如果我们要对这个方法动手在invoke方法上动手脚...未完待续............

<script type="text/javascript" id="wumiiRelatedItems"> </script>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值