• java动态代理


    定义动态代理类DynamicProxy

    package com.zte.adc.common;

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;

    public class DynamicProxy implements InvocationHandler {

     private Object object;

     // 绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
     // Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法
     public Object bindRelation(Object object) {
      this.object = object;
      return Proxy.newProxyInstance(object.getClass().getClassLoader(),
        object.getClass().getInterfaces(), this);
     }

     // 拦截关联的这个实现类的方法被调用时将被执行,只要是代理的类执行方法 首先经过invoke方法
     public Object invoke(Object proxy, Method method, Object[] args)
       throws Throwable {
      if ("queryForList".equals(method.getName()) && args.length == 4) {
       args[2] = (Integer) args[2] - 1;

      }
      Object result = method.invoke(object, args);
      return result;
     }

    }

    获得动态代理的代理对象 注意动态代理返回的对象必须是被代理对象的接口

     public SqlMapClientTemplate sqlTemplate1 = this.getSqlMapClientTemplate();
     public SqlMapClientOperations sqlTemplate=null;//这里1
     private DynamicProxy dp = new DynamicProxy();
     {
      sqlTemplate= (SqlMapClientOperations)dp.bindRelation(sqlTemplate1);
     }
     
     public BaseSqlMapDao() {

     }

    如果在 “这里1”中用的不是SqlMapClientTemplate 的借口 而是直接用的SqlMapClientTemplate  那么

    就会抛出异常

     

    动态代理的原理就是通过动态代理类DynamicProxy 生成了一个新的对象 Proxy对象

    该新对象继承的接口就是原对象的接口,产生的新对象并不是源对象的实例 而是产生的代理对象的实例

  • 相关阅读:
    Allow Zero Length 允许空字符串 ACCESS
    数据集永久字段的Visble 属性为何不起作用
    Microsoft Jet 数据库引擎 SQL 和 ANSI SQL 的比较
    Microsoft 数据访问组件 (MDAC) 的版本历史记录
    Windows 7 英文版操作系统中文软件乱码解决方法
    DBLookupComboBox 的初始值
    无法为更新定位行,一些值可能已在最后一次读取后已更改
    [hdu6428]Problem C. Calculate
    [hdu6437]Problem L. Videos
    [hdu6434]Problem I. Count
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331970.html
Copyright © 2020-2023  润新知