zoukankan      html  css  js  c++  java
  • 动态代理2

    2. 动态代理作用

    最终是学习AOP(面向切面编程),它与装饰者模式有点相似,它比装饰者模式还要灵活!

    InvocationHandler

    public Object invoke(Object proxy, Method method, Object[] args);

     

    这个invoke()方法在什么时候被调用!

    1. 在代理对象被创建时?错误的!

    2. 在调用代理对象所实现接口中的方法时?正确的!

     

    * Object proxy:当前对象,即被代理的对象!在调用谁的方法!

    * Method method:当前被调用的方法(目标对象的方法)

    * Object[] args:实参!

    目标对象:被增强的对象

    代理对象:需要目标对象,然后在目标对象上添加了增强后的对象!

    目标方法:增强的内容

    代理对象 = 目标对象 + 增强

     

    实例:

    文件说明: 1. 一个 Waiter 接口,里面有 server () 方法

         2. 实现 了 Waiter 接口 的 ManWaiter 类

         3. Test.java 类

    1. Waiter.java 接口

    // 服务员

    public interface Waiter {

        // 服务

        public void serve();

    }

     

    2.ManWaiter.java 类, 实现了 Waiter 接口

     

    //该类实现了 Waiter 接口

    public class ManWaiter implements Waiter {

        public void serve() {

            System.out.println("服务中...");

        }

    }

     

    3. Test.java 测试类

    /**

    * 我们必须要掌握的是当前这个案例!

    */

    public class Demo2 {

        @Test

        public void fun1() {

            Waiter manWaiter = new ManWaiter();//目标对象

            /*

             * 给出三个参数,来创建方法,得到代理对象

             */

            ClassLoader loader = this.getClass().getClassLoader();

            Class[] interfaces = {Waiter.class};

            InvocationHandler h = new WaiterInvocationHandler(manWaiter);//参数manWaiter表示目标对象

            // 到代理对象,代理对象就是在目标对象的基础上进行了增强的对象!

            Waiter waiterProxy = (Waiter)Proxy.newProxyInstance(loader, interfaces, h);

            

            waiterProxy.serve();//前面添加"您好", 后面添加"再见"

        }

    }

     

    //WaiterInvocationHandler 实现了 InvocationHandler 接口,并重写了 里面的 invoke() 方法

    class WaiterInvocationHandler implements InvocationHandler {

        private Waiter waiter;//目标对象

        

        //提供 构造方法,为私有的目标对象 赋值

        public WaiterInvocationHandler(Waiter waiter) {

            this.waiter = waiter;

        }

        

        public Object invoke(Object proxy, Method method, Object[] args)

                throws Throwable {

            System.out.println("您好!");

            this.waiter.serve();//调用目标对象的目标方法

            System.out.println("再见!");

            return null;

        }

    }

     

    运行结果:

  • 相关阅读:
    区间DP入门
    Prime Permutation(思维好题 )
    小字辈 (bfs好题)
    博弈论小结之尼姆博弈
    Hometask
    Lucky Sum (dfs打表)
    对称博弈
    尼姆博弈
    莫队算法 ( MO's algorithm )
    Codeforces 988D Points and Powers of Two ( 思维 || 二的幂特点 )
  • 原文地址:https://www.cnblogs.com/Prozhu/p/5453087.html
Copyright © 2011-2022 走看看