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

    关于Proxy:

    1,他是所有动态代理的父类;

    2,他可以用作创建动态代理类和动态代理对象;

    3,JDK中自带的动态代理。

    1,首先创建一个接口,方法申明如下:

    package com.proxy;
    
    public interface IDog {
        public void bark();
        public void guard();
        
    }

    2,再创建需要代理的类,并且实现上面的接口:

    package com.proxy;
    
    
    public class ADog implements IDog{
    
        @Override
        public void bark() {
            System.out.println("卖萌");
        }
    
        @Override
        public void guard() {
            System.out.println("耍宝");
        }
    
    }

    3,首先创建一个动态代理类,并且实现invocationHandler,具体代码如下:

    
    
    
    

    package com.proxy;

    
    

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;

    
    

    public class DogHandler implements InvocationHandler{
    IDog Dgod ;
    public DogHandler() {
    }
    public DogHandler(IDog dog) {
    this.Dgod = dog;
    }
    /**重写了invactionHandler的方法
    *参数发疯别为:被代理对象 需要调用的方法 方法中的参数
    *方法传进去后,利用反射调用方法
    */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("开始");
    method.invoke(Dgod, args);
    System.out.println("结束");
    return null;
    }

    }

     

    4,写道此处动态代理就完成了,下面i进入测试阶段;代码如下

    
    

    package com.proxy;

    
    

    import java.lang.reflect.Proxy;

    
    

    public class Client {
    public static void main(String[] args) {
    //创建一个真实对象,用作实参传入DogHandler方法(处理器方法)
    IDog dog = new ADog();
    //创建处理器对象
    DogHandler handler = new DogHandler(dog);
    //利用Proxy.newProxyInstance方法创建代理对象,并且把对应的参数传入
    //注意
    IDog proxy = (IDog)Proxy.newProxyInstance(dog.getClass().getClassLoader(), dog.getClass().getInterfaces(), handler);
    //调用方法
    proxy.bark();
    }
    }

     

    优点:由于每次调用代理对象的方法都会调用public Object invoke(Object proxy, Method method, Object[] args)方法,所以可以在此方法中调用一些重复性较高的代码,以此提高代码的可读性和可维护性。

  • 相关阅读:
    TCP建立连接三次握手和释放连接四次握手
    集群/分布式环境下5种session处理策略
    MySQL两种引擎的区别
    【深入理解JVM】:类加载器与双亲委派模型
    Spring Cloud组件完整
    用Redis轻松实现秒杀系统
    分布式锁的基本原理
    中文分词-jieba
    win10安装mysql5.7.20解压版
    tenaorflow函数(1)
  • 原文地址:https://www.cnblogs.com/hunt1coder/p/10732706.html
Copyright © 2011-2022 走看看