设计模式之-动态代理

我们需要掌握两个类的使用:

  • public interface InvocationHandler
    InvocationHandler是通过一个代理实例调用处理程序实现的接口。

    可以通过invoke方法实现对真实角色的代理访问.

    通过proxy生成代理类对象,都要指定对应的处理器对象.

    • invoke

      Object invoke(Object proxy,方法 method,Object[] args)throws Throwable
      在代理实例上处理方法调用,并返回结果。当在与它关联的代理实例上调用方法时,该方法将在调用处理程序上调用此方法。
      参数
      proxy -代理实例,调用的方法
      对接口方法的调用相应的 method代理实例的 方法实例。声明类的 方法对象将接口的方法声明,这可能是一个超接口代理接口,代理类继承的方法。
      args -包含在方法上通过代理实例调用的实参的值对象的数组,或 null如果接口方法不需要参数。原始类型的实参是包裹在适当的原始包装类的实例,如 java.lang.Integerjava.lang.Boolean
       
      代码:
      star
       1 package org.west.demo;
       2 
       3 public interface Star {
       4     //面谈
       5     void confer();
       6     //签合同
       7     void signContart();
       8     //订票
       9     void bookTacket();
      10     //唱歌
      11     void sign();
      12     //收尾款
      13     void collentMoney();
      14 }

      realstar

    •  1 package org.west.demo;
       2 
       3 public class RealStar implements Star{
       4     public void confer() {
       5 
       6     }
       7 
       8     public void signContart() {
       9 
      10     }
      11 
      12     public void bookTacket() {
      13 
      14     }
      15 
      16     public void sign() {
      17         System.out.println("周杰伦:唱歌");
      18     }
      19 
      20     public void collentMoney() {
      21 
      22     }
      23 }

      starhandler

    •  1 package org.west.demo;
       2 
       3 import java.lang.reflect.InvocationHandler;
       4 import java.lang.reflect.Method;
       5 
       6 public class StarHandler implements InvocationHandler {
       7 
       8       Star realStar;
       9 
      10     public StarHandler(Star realStar) {
      11         this.realStar = realStar;
      12     }
      13 
      14     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      15 
      16         System.out.println("处理事务前");
      17 
      18         method.invoke(realStar,args);
      19 
      20         System.out.println("处理事务后");
      21         return null;
      22 
      23 
      24 
      25     }
      26 }

      client

    • import java.lang.reflect.Proxy;
      
      public class Client {
      
          public static void main(String[] args) {
             Star realStar = new RealStar();
              StarHandler handler = new StarHandler(realStar);
      
              Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
      
              proxy.sign();
      
          }
      
      }

      总结:

    • 当我们调代理类的方法 就会进入invoke方法里面执行一次.我们可以在invoke方法中做一些事情的处理.
posted @ 2019-07-29 18:10  七月的风没有雨  阅读(223)  评论(0编辑  收藏  举报