• 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)方法,所以可以在此方法中调用一些重复性较高的代码,以此提高代码的可读性和可维护性。

  • 相关阅读:
    macOS下查看端口是否被占用命令
    macOS下安装tomcat服务器
    unittest 知识问答题-也许面试会有用-欢迎补充
    python.unittest中常用断言方法
    如何在命令行terminal中运行pycharm项目
    如何保证 软件测试覆盖率
    如何衡量 测试覆盖率
    软件测试全流程 总结
    接口测试对传统测试模型的改进
    关于http/https协议
  • 原文地址:https://www.cnblogs.com/hunt1coder/p/10732706.html
Copyright © 2020-2023  润新知