博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态代理初识
阅读量:4654 次
发布时间:2019-06-09

本文共 2114 字,大约阅读时间需要 7 分钟。

代理模式

* 概念:
  1. 真实对象:被代理的对象
  2. 代理对象:
  3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
* 实现方式:
  1. 静态代理:有一个类文件描述代理模式
  2. 动态代理:在内存中形成代理类
* 实现步骤:
  1. 代理对象和真实对象实现相同的接口
  2. 代理对象 = Proxy.newProxyInstance();
  3. 使用代理对象调用方法。
  4. 增强方法

* 增强方式:

  1. 增强参数列表
  2. 增强返回值类型
  3. 增强方法体执行逻辑

 

public class ProxyTest {    public static void main(String[] args) {        //1.创建真实对象        Lenovo lenovo = new Lenovo();                //2.动态代理增强lenovo对象        /*            三个参数:                1. 类加载器:真实对象.getClass().getClassLoader()                2. 接口数组:真实对象.getClass().getInterfaces()                3. 处理器:new InvocationHandler()         */        SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {            /*                代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行                    参数:                        1. proxy:代理对象                        2. method:代理对象调用的方法,被封装为的对象                        3. args:代理对象调用的方法时,传递的实际参数             */            @Override            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                /*System.out.println("该方法执行了....");                System.out.println(method.getName());                System.out.println(args[0]);*/                //判断是否是sale方法                if(method.getName().equals("sale")){                    //1.增强参数                    double money = (double) args[0];                    money = money * 0.85;                    System.out.println("专车接你....");                    //使用真实对象调用该方法                    String obj = (String) method.invoke(lenovo, money);                    System.out.println("免费送货...");                    //2.增强返回值                    return obj+"_鼠标垫";                }else{                    Object obj = method.invoke(lenovo, args);                    return obj;                }            }        });        //3.调用方法       /* String computer = proxy_lenovo.sale(8000);        System.out.println(computer);*/        proxy_lenovo.show();    }}

 

转载于:https://www.cnblogs.com/yong2018/p/9703461.html

你可能感兴趣的文章
Network 第六篇 - 三层交换机配置路由功能
查看>>
OSL LLVM 3.3 Related Changes
查看>>
1.4 99乘法表
查看>>
雇佣K个工人的最小费用 Minimum Cost to Hire K Workers
查看>>
mysql优化方法
查看>>
[转]【HttpServlet】HttpServletResponse接口 案例:完成文件下载
查看>>
Eclipse配置默认的编码集为utf-8
查看>>
初学Python
查看>>
rman 脚本备份全过程
查看>>
Python小技巧
查看>>
fragment Activity之间传值的方法 之------------接口回调
查看>>
OSS研究
查看>>
Leetcode 116 Populating Next Right Pointers in Each Node
查看>>
Angular 1.63 双向数据绑定 通过 $http 发送数据
查看>>
php以及前端的一些小小的技术要点
查看>>
【精解】EOS标准货币体系与源码实现分析
查看>>
AFore.NET 翻译
查看>>
[大牛翻译系列]Hadoop(8)MapReduce 性能调优:性能测量(Measuring)
查看>>
SQLYog快捷键大全
查看>>
ASP.NET ACCESS 分页
查看>>