zoukankan      html  css  js  c++  java
  • 设计模式之-动态代理

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

    • 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方法中做一些事情的处理.
  • 相关阅读:
    硬盘参数你都懂吗?(上)-从案例引发的讨论
    Python 面试题(下)
    Python 面试题(上)
    DNS 原理入门
    从硬盘设计思想到RAID改良之道
    (转)短信vs.推送通知vs.电子邮件:app什么时候该用哪种方式来通知用户?
    (转)移动端主动推送消息原理
    (转)OpenFire源码学习之十七:HTTP Service插件
    (转)openfire插件开发(二) 基于web的插件开发
    (转)openfire插件开发(一)
  • 原文地址:https://www.cnblogs.com/xiaoqiqistudy/p/11265588.html
Copyright © 2011-2022 走看看