动态代理3之代理工厂实现

动态代理的深化:承接动态代理2( 对 上级实例进行 深化),也就是 spring 的前身

(必须掌握)实例:

文件说明:1.有一个Waiter接口,该接口有一个 server() 、ShouQian()方法

2.有一个 Waiter接口的实现类,ManWaiter类

3.一个 测试Test类

     4. 后置增强接口: AfterAdvice 接口

     5.前置增强接口:BeforeAdvice接口

     6. 生成代理对象 的 ProxyFactory类

1. Waiter.java 接口

// 服务员

public interface Waiter {

    // 服务

    public void serve();

    

    //收钱

    public void shouQian();

}

 

2. BeforeAdvice.java 接口,前置增强接口

/**

* 前置增强

* @author cxf

*

*/

public interface BeforeAdvice {

    public void before();

}

 

3. AfterAdvice.java 接口,后置增强接口

/**

* @function 后置增强

* @author not-bug

*

*/

public interface AfterAdvice {

    public void after();

}

 

4 . ManWaiter.java 类,该类实现了 Waiter接口

//该类实现了 Waiter 接口

public class ManWaiter implements Waiter {

    public void serve() {

        System.out.println("服务中...");

    }

    

    public void shouQian() {

        System.out.println("混蛋,给我钱!");

    }

}

 

5. ProxyFactory.java 类,用来生成代理对象的类

/**

* 它用来生成代理对象

* 它需要所有的参数

* * 目标对象

* * 增强

* @author cxf

*/

/**

* 1. 创建代理工厂

* 2. 给工厂设置三样东西:

* * 目标对象:setTargetObject(xxx);

* * 前置增强:setBeforeAdvice(该接口的实现)

* * 后置增强:setAfterAdvice(该接口的实现)

* 3. 调用createProxy()得到代理对象

* * 执行代理对象方法时:

* > 执行BeforeAdvicebefore()

* > 目标对象的目标方法

* > 执行AfterAdviceafter()

* @author cxf

*

*/

public class ProxyFactory {

    private Object targetObject;//目标对象

    private BeforeAdvice beforeAdvice;//前置增强

    private AfterAdvice afterAdvice;//后置增强

      

    

    /**

     * 用来生成代理对象

     * @return

     */

    public Object createProxy() {

        /*

         * 1. 给出三大参数

         */

        ClassLoader loader = this.getClass().getClassLoader();

        Class[] interfaces = targetObject.getClass().getInterfaces();

        InvocationHandler h = new InvocationHandler() {

            public Object invoke(Object proxy, Method method, Object[] args)

                    throws Throwable {

                /*

                 * 在调用代理对象的方法时会执行这里的内容

                 */

                // 执行前置增强

                if(beforeAdvice != null) {

                    beforeAdvice.before();

                }

                

                Object result = method.invoke(targetObject, args);//执行目标对象的目标方法

                // 执行后置增强

                if(afterAdvice != null) {

                    afterAdvice.after();

                }

                

                // 返回目标对象的返回值

                return result;

            }

        };

        /*

         * 2. 得到代理对象

         */

        Object proxyObject = Proxy.newProxyInstance(loader, interfaces, h);

        return proxyObject;

    }

      

    

    public Object getTargetObject() {

        return targetObject;

    }

    public void setTargetObject(Object targetObject) {

        this.targetObject = targetObject;

    }

    public BeforeAdvice getBeforeAdvice() {

        return beforeAdvice;

    }

    public void setBeforeAdvice(BeforeAdvice beforeAdvice) {

        this.beforeAdvice = beforeAdvice;

    }

    public AfterAdvice getAfterAdvice() {

        return afterAdvice;

    }

    public void setAfterAdvice(AfterAdvice afterAdvice) {

        this.afterAdvice = afterAdvice;

    }

}

 

6. Test.java ,测试类

 

/*

* 目标是让目标对象和增强都可以切换!

*/

public class Demo3 {

    @Test

    public void fun1() {

        ProxyFactory factory = new ProxyFactory();//创建工厂

        factory.setTargetObject(new ManWaiter());//设置目标对象

        factory.setBeforeAdvice(new BeforeAdvice() {//设置前置增强

            public void before() {

                System.out.println("您好不好!");

            }

        });

        

        factory.setAfterAdvice(new AfterAdvice() {//设置后置增强

            public void after() {

                System.out.println("再见不见!");

            }

        });

        

        Waiter waiter = (Waiter)factory.createProxy();

        //waiter.shouQian();

        waiter.serve();

    }

    

    //转账方法

    public void zhuanZhang() {

        /*

         * 1.

         * 2.

         * 3.

         */

    }

}

 

运行结果:

转载于:https://www.cnblogs.com/Prozhu/p/5452962.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个简单的XML文档例子

一个简单的XML文档例子: <?xml version"1.0"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Dont forget me this weekend!</body> </note> 文档的第一…

python set

python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算. sets 支持 x in set, len(set),和 for x in set。作为一个无序的集…

【bug修复】解决ValueError: Tensor(“Variable:0“ dtype=float32_ref) must be from the same graph as Tensor(“R

bug:描述 在进行tensorflow进行搭建CNN网络时&#xff0c;在定义CNN的py文件中调用cnn模型&#xff0c;运行正常&#xff0c;但是在其他py文件中进行时就出现问题 ValueError: Tensor(“Variable:0” dtypefloat32_ref) must be from the same graph as Tensor(“Reshape:0”,…

XML —— DTD介绍

一、DTD介绍 Document Type Definition&#xff1b; DTD是一种XML的约束方式&#xff0c;除了此种约束方式外&#xff0c;还有XSchema&#xff0c;XSchema比DTD的约束能力还要强&#xff0c;因此DTD正在逐渐淘汰&#xff1b; DTD的目的就是约束XML标签的写法&#xff1b;比如在…

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

更新的软件可以解决 TortoiseGit-preview-2.5.7.0-20180127-b2d00f8-64bit.msi和Git-2.16.2-64-bit.exe。 链接地址为&#xff1a; https://github.com/git-for-windows/git/releases/download/v2.16.2.windows.1/Git-2.16.2-64-bit.exe https://download.tortoisegit.org/tgi…

Linux 图片传输功能c/c++(初版)

由于深度学习任务的需要&#xff0c;要在程序里面嵌入一个module。 这个module 的功能是接收来自ios客户端的图片。并且传送给深度学习分类器进行处理。 于是看了看各种各样的 module 实现方案。 先是用IO函数把图片以数组的方式存起来。 再和服务器建立连接&#xff0c;socket…

Val编程-val系列编程思想

利用Val语言可以编写出各种各样的应用程序。正如windows phone面临的窘境一样&#xff0c;受众太小&#xff0c;市场不大。应用程序不多&#xff0c;所以也谈不上成熟。国内的应用程序基本上就是简单的小程序&#xff0c;谈不上什么编程思想。国外许多都是基于kernel的而衍生出…

Celery的实践指南

Celery的实践指南celery原理&#xff1a;celery实际上是实现了一个典型的生产者-消费者模型的消息处理/任务调度统&#xff0c;消费者(worker)和生产者(client)都可以有任意个&#xff0c;他们通过消息系统&#xff08;broker&#xff09;来通信。典型的场景为&#xff1a;客户…

【pyqt5学习】——bug修复,利用qt资源库qrc文件进行背景图像设置,不显示图像

目录 bug描述 bug分析 bug解决 bug描述 利用下面文章的方法进行资源设置后&#xff0c;有的显示了有的没有显示 【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写_有情怀的机械男的博客-CSDN博客_python qrc目录一、说明二、安装pyqt5以及相关工具&#xff08;pyqt5、pyuic…

Datalore:用于机器学习可视化的新Web方案!

前不久&#xff0c;JetBrains团队发布了Datalore&#xff0c;这是一款基于云的web应用程序&#xff0c;用于构建机器学习模型并在Python中创建丰富的可视化。最新的测试版本旨在简化构建机器学习模型的流程&#xff0c;并帮助开发人员进行数据分析。由于Datalore的智能编码辅助…

Val3语言介绍

Val3语言是一门专门针对特定工业机器人的一门语言。在墙内有关这方面的介绍非常的少。在墙外维基百科上有一篇详细介绍的,有空FQ摘抄在这里。 Val3是使用XML格式。可以使用XML编辑器来进行编写VAL3的程序&#xff0c;可直接在模拟器上或者示教盒上编程&#xff0c;一般推荐使用…

网络层相关问题

1.说一下网络层的总体结构。 2.有没有看过源码&#xff1f; A.继承Request   B.打日志   C.修改参数 3.说一下Volley整体结构。 4.有了解过OkHttp吗&#xff1f; 5.说一下OkHttp和Volley的区别&#xff1f;转载于:https://www.cnblogs.com/jarvisyin/p/6389553.html

CSS魔法堂:重拾Border之——图片作边框

前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊&#xff0c;一想到终于不用再添加额外元素来模拟圆角了&#xff0c;但发现border-radius还分水平半径和垂直半径&#xff0c;然后又发现border-top-left/right-radius的水平半径之和大于元素宽度时&#xff0c;实际值会…

共享内存简介和mmap 函数

一、共享内存简介 共享内存区是最快的IPC形式&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 即每个进程地址空间都有一个共享存储器的映射区&#xff0c;当这块区域都映射到相同的真正的物理地址空…

【pyqt5学习】——QToolTip,QLabel控件,伙伴关系

目录 0、学习资源 1、给控件设置提示信息——QToolTip 2、QLabel控件&#xff08;显示图像、设置超链接、信号绑定&#xff09; 3、QLabel伙伴关系 1&#xff09;代码 2&#xff09;效果 3&#xff09;知识点addWidget 0、学习资源 PyQt5教程&#xff0c;来自网易云课堂…

Hello IT

从高中的计算机课开始学习如何按下开机键&#xff0c;如何上网&#xff0c;如何背诵五笔字根&#xff0c;再到大学中如何使用office,利用C编码做算法&#xff0c;到现在IT中的伪一员&#xff0c;时间算起来也不短&#xff0c;然正在入门是在2010年8月杭州参加嵌入式培训&#x…

ARM指令集2

ARM指令集2 ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据&#xff0c;加载指令用于将存储器中的数据传送到寄存器&#xff0c;存储指令则完成相反的操作。 LDR指令&#xff08;与MOV有区别&#xff0c;MOV只能操作通用寄存器&#xff09; LDR指令格式为&…

SylixOS中select原理及使用分析

2019独角兽企业重金招聘Python工程师标准>>> 1. select接口简介 1.1 select接口使用用例 select是操作系统多路I/O复用技术实现的方式之一。 多路I/O复用技术大致使用场景为&#xff1a;构造一张感兴趣的文件描述符列表&#xff0c;然后调用多路复用的IO接口&#x…

【pyqt5学习】——QLineEdit学习(回显模式)

目录 1、回显模式 2、成果显示 3、知识点 1&#xff09;FormLayout布局添加addRow方法 2&#xff09;在输入框显示灰色提示字体&#xff0c;输入内容时消失setPlaceholderText 3&#xff09;设置回显模式setEchoMode 4、完整代码 1、回显模式 QLineEdit控件的主要功能是输…

有关机械手臂控制中的两个重要输入参数

1.在机械手臂中有两个重要参数。一个是编码器的值&#xff0c;另外一个是马达的电流值。根据这两个可以获得机械手臂的运动学&#xff0c;动力学的一些数据。第一重要特征参数 是DH参数&#xff0c;另外一个就是每个轴的质心参数。