zoukankan      html  css  js  c++  java
  • 代理模式_动态代理

    一、代理模式_动态代理

      静态代理和动态代理要代理的角色都是一样的,这个代理角色前面静态代理中已经提到,此处不做过多解释。

    二、动态代理示例

      2.1抽象角色  

    package edu.aeon.model.dynamicproxy_v1;
    
    /**
     * [说明]:抽象角色
     * 
     * @author aeon(qq:1584875179)
     *
     */
    public interface AbstractRole {
        /***
         * 房屋出租
         */
        void rent();
    }

      2.2真实角色(被代理角色)  

    package edu.aeon.model.dynamicproxy_v1;
    
    /**
     * [说明]:房东(真实角色)
     * 
     * @author aeon(qq:1584875179)
     *
     */
    public class HouseOwner implements AbstractRole {
    
        @Override
        public void rent() {
            System.out.println("HouseOwner.rent()_房屋出租");
        }
    }

      2.3动态代理类(重点)  

    package edu.aeon.model.dynamicproxy_v1;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    /**
     * [说明]:能动态生成代理角色并执行被代理角色行为的类
     * @author aeon(qq:1584875179)
     *
     */
    public class ProxyInvocationHandler implements InvocationHandler{
        //被代理角色接口类型
        private AbstractRole abstractRole;
        public void setAbstractRole(AbstractRole abstractRole) {
            this.abstractRole = abstractRole;
        }
        /**
         * 生成代理类
         * @return 返回生成的代理类实例
         */
        public Object getProxy(){
            return Proxy.newProxyInstance(this.getClass().getClassLoader(), abstractRole.getClass().getInterfaces(), this);
        }
        /**
         * 执行代理的方法
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            before();
            //abstractRole:被代理角色类型,此处为了它的接口类型    args:被代理角色执行方法参数
            Object result=method.invoke(abstractRole, args);
            after();
            return result;
        }
        /**
         * 执行代理前做某些工作
         */
        public void before(){
            System.out.println("ProxyInvocationHandler.before()_执行代理前做某些工作...");
        }
        /**
         * 执行代理后做某些工作
         */
        public void after(){
            System.out.println("ProxyInvocationHandler.after()_执行代理后做某些工作...");
        }
    }

      2.4测试动态代理

    package edu.aeon.model.dynamicproxy_v1;
    /**
     * [说明]:测试动态代理
     * @author aeon(qq:1584875179)
     *
     */
    public class Test {
    
        public static void main(String[] args) {
            //真实角色
            HouseOwner houseOwner=new HouseOwner();
            //动态代理类实例
            ProxyInvocationHandler proxyInvocationHandler=new ProxyInvocationHandler();
            //设置被代理类为:houseOwner
            proxyInvocationHandler.setAbstractRole(houseOwner);
            //得到代理类实例
            AbstractRole abstractRole = (AbstractRole)proxyInvocationHandler.getProxy();
            //执行被代理的方法
            abstractRole.rent();
        }
    
    }

      执行结果截图如下:

      

    三、静态代理和动态代理

      静态代理的代理类是固定的且每一个业务类都要对应一个代理类,而动态代理的代理类是动态生成的、一个万能动态代理类可以代理所有类要做的事。

    四、通用动态代理类

      4.1通用动态代理类

    package edu.aeon.model.dynamicproxy_v2;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    /**
     * [说明]:通用动态生成代理角色并执行被代理角色行为的类
     * @author aeon(qq:1584875179)
     *
     */
    public class ProxyInvocationHandler implements InvocationHandler{
        //通用被代理角色接口类型
        private Object target;
        public void setTarget(Object target) {
            this.target = target;
        }
        /**
         * 生成代理类
         * @return 返回生成的代理类实例
         */
        public Object getProxy(){
            return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        }
        /**
         * 执行代理的方法
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            before();
            //abstractRole:被代理角色类型,此处为了它的接口类型    args:被代理角色执行方法参数
            Object result=method.invoke(target, args);
            System.out.println("执行了"+method.getName()+"方法!");
            after();
            return result;
        }
        /**
         * 执行代理前做某些工作
         */
        public void before(){
            System.out.println("ProxyInvocationHandler.before()_执行代理前做某些工作...");
        }
        /**
         * 执行代理后做某些工作
         */
        public void after(){
            System.out.println("ProxyInvocationHandler.after()_执行代理后做某些工作...");
        }
    }

      4.2通用动态代理类测试  

    package edu.aeon.model.dynamicproxy_v2;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * [说明]:测试动态代理类
     * @author aeon(qq:1584875179)
     *
     */
    public class Test {
    
        public static void main(String[] args) {
            //真实角色
            HouseOwner houseOwner=new HouseOwner();
            //动态代理类实例
            ProxyInvocationHandler proxyInvocationHandler=new ProxyInvocationHandler();
            //设置被代理类为:houseOwner
            proxyInvocationHandler.setTarget(houseOwner);
            //得到代理类实例
            AbstractRole abstractRole = (AbstractRole)proxyInvocationHandler.getProxy();
            //执行被代理的方法
            abstractRole.rent();
            System.out.println("不光可以代理以上类、还可以代理所有类,示例如下:");
            proxyInvocationHandler.setTarget(new ArrayList());
            List proxyList=(List) proxyInvocationHandler.getProxy();
            proxyList.add("test");
            proxyList.size();
            proxyList.get(0);
        }
    
    }

      测试结果截图如下:

      

    如有任何疑问可联系邮箱: 给我发邮件、或直接联系QQ:1584875179 || 点返回首页

  • 相关阅读:
    快速了解layui中layer的使用
    导航栏切换按钮事件
    jQuery中 end(); 的用法
    JS中关于 一个关于计时器功能效果的实现
    js 中 setInterval 的返回值问题
    javascript 构造函数中的属性与原型上属性优先级的比较
    斐波那契数列 -- 递归算法(-)
    javascript 变量声明有var与无var 的区别
    作用域的理解--第一篇
    Javascript---数组常用方法
  • 原文地址:https://www.cnblogs.com/aeon/p/10280331.html
Copyright © 2011-2022 走看看