• 设计模式之--代理模式(动态代理)


    JDK 提供的动态代理的两个相关的类:InvocationHandler 和 Proxy

    一:Proxy
      Proxy 提供了一个获取实例的静态方法
      public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
      1 ClassLoader loader 目标对象类加载器(包含目标对象的属性、行为),
      2 Class<?>[] interfaces 目标对象包含的所有接口
      -------------------------1、2 这两个参数可以生成代理对象  
      3 InvocationHandler h 使用目标对象方法时,触发调用控制器中的invoke方法,做特殊业务处理
      代理过程:根据目标对象的类加载器和所有接口生成代理对象,代理对象将目标对象的所有方法实现转移到InvocationHandler中的invoke中,
      以便做业务逻辑中的特殊处理,AOP 就是这样实现的

    二:InvocationHandler 
      InvocationHandler 接口只提供了一个接口方法
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
      1 Object proxy  目标对象  
      2 Method method 动态代理对象的方法  
      3 Object[] args 动态代理对象的方法参数
      在invoke中调用目标对象的指定方法,并进行差异化业务处理

    三:接口
      

    package dmode.proxy;
    
    /** 
     * 类描述:  接口
     * @version 1.0  CreateDate: 2015-2-13
     */
    public interface Subject {
        
        /**
         * 方法描述:上班打卡
         */
        public void punchCard(String name,String company);
    }

    四:实现类

    package dmode.proxy;
    
    /** 
     * 类描述:  员工
     * @version 1.0  CreateDate: 2015-2-13
     */
    public class Employer implements Subject{
    
        @Override
        public void punchCard(String name,String company) {
            System.out.println(name + "上班打卡.......公司:" + company);
        }
    }

    五:动态代理类

    package dmode.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /** 
     * 类描述:  动态代理类
     * @version 1.0  CreateDate: 2015-2-13
     */
    public class DynamicProxy implements InvocationHandler{
        
        //被代理实例
        Object object = null;
        
        public DynamicProxy(Object _obj){
            this.object = _obj;
        }
        /**
         * JDK 动态代理方法,对被代理类的方法进行代理
         * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            
            //此处可以通过Method 来根据不同的方法做不同特色业务处理,利用反射
         System.out.println("动态代理执行打卡...");
            Object result = method.invoke(this.object, args);
            return result;
        }
        
        /**
         * 方法描述:获取代理对象
         * @param subject
         * @return
         */
        public static Subject getProxy(Subject subject){
            ClassLoader classLoader = subject.getClass().getClassLoader();
            Class<?>[] interfaceArry = subject.getClass().getInterfaces();
            InvocationHandler invoHandler = new DynamicProxy(subject);
            Object object = Proxy.newProxyInstance(classLoader, interfaceArry,invoHandler);
            return (Subject)object;
        }
    
    }

    六:应用场景

    package dmode.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    /** 
     * 类描述:  入口
     * @version 1.0  CreateDate: 2015-2-13
     */
    public class Acce {
        public static void main(String[] args) {
            Subject emp = new Employer();
            Subject dyProxy = DynamicProxy.getProxy(emp);
            dyProxy.punchCard("zzd","fencer");
            dyProxy.beOnDuty();
            dyProxy.offDuty();
        }
    }
  • 相关阅读:
    CodeSmith入门教程
    AJAX调用实例
    药品监控增加表结构
    典型SQL 语句总结
    CRM中常用代码
    win2000sever+IIS5不能下载exe文件处理方法
    常用的文件对应的MIME类型
    数据库范式1NF 2NF 3NF BCNF
    多线程编程中如何更改UI值
    NHibernate学习笔记(2)—关系映射
  • 原文地址:https://www.cnblogs.com/leonkobe/p/4292570.html
Copyright © 2020-2023  润新知