JAVA代理模式与动态代理模式
1、代理模式
所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费。但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的。这点很重要!
上面这个例子,你就是“客户”,票务中心就是“代理角色”,火车站是“真实角色”,卖票称为“抽象角色”!
代理模式JAVA代码示例:
//抽象角色:抽象类或接口
- interface Business
- {
- void doAction();
- }
//真实角色:真正实现了业务逻辑接口
//代理角色:自己并未实现业务逻辑接口,而是调用真实角色来实现
- class BusinessImplProxy implements Business
- {
- private BusinessImpl bi;
- public void doAction()
- {
- if (bi==null)
- {
- bi = new BusinessImpl();
- }
- doBefore();
- bi.doAction();
- doAfter();
- }
- public void doBefore()
- {
- System.out.println("前置处理!");
- }
- public void doAfter()
- {
- System.out.println("后置处理!");
- }
- }
- //测试类
- class Test
- {
- public static void main(String[] args)
- {
- //引用变量定义为抽象角色类型
- Business bi = new BusinessImplProxy();
- bi.doAction();
- }
- }
所以,借助于JVM的支持,可以在运行时动态生成代理类(“代理角色”),我们就可以解决上述代理模式中代码膨胀的问题,使用了动态代理后,“代理角色”将不用手动生成,而由JVM在运行时,通过指定类加载器、接口数组、调用处理程序这3个参数来动态生成。
动态代理模式JAVA代码示例:
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Proxy;
- import java.lang.reflect.Method;
- //抽象角色:java动态代理的实现目前只支持接口,不支持抽象类
- interface BusinessFoo
- {
- void foo();
- }
- interface BusinessBar
- {
- String bar(String message);
- }
- //真实角色:真正实现业务逻辑方法
- class BusinessFooImpl implements BusinessFoo
- {
- public void foo()
- {
- System.out.println("BusinessFooImpl.foo()");
- }
- }
- class BusinessBarImpl implements BusinessBar
- {
- public String bar(String message)
- {
- System.out.println("BusinessBarImpl.bar()");
- return message;
- }
- }
- //动态角色:动态生成代理类
- class BusinessImplProxy implements InvocationHandler
- {
- private Object obj;
- BusinessImplProxy() {
- }
- BusinessImplProxy(Object obj) {
- this.obj = obj;
- }
- public Object invoke(Object proxy,Method method,Object[] args) throws Throwable
- {
- Object result = null;
- doBefore();
- result = method.invoke(obj,args);
- doAfter();
- return result;
- }
- public void doBefore(){
- System.out.println("do something before Business Logic");
- }
- public void doAfter(){
- System.out.println("do something after Business Logic");
- }
- public static Object factory(Object obj)
- {
- Class cls = obj.getClass();
- return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new BusinessImplProxy(obj));
- }
- }
- //测试类
- public class DynamicProxy
- {
- public static void main(String[] args) throws Throwable
- {
- BusinessFooImpl bfoo = new BusinessFooImpl();
- BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo);
- bf.foo();
- System.out.println();
- BusinessBarImpl bbar = new BusinessBarImpl();
- BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar);
- String message = bb.bar("Hello,World");
- System.out.println(message);
- }
- }
程序流程说明:
new BusinessFooImpl();创建一个“真实角色”,传递给工厂方法BusinessImplProxy.factory(),进而初始化“调用处理器”——即实现InvocationHandler的类。并返回一个动态创建的代理类实例,由于“代理角色”也必然实现了“抽象角色”提供的业务逻辑方法,故可向下转型为BusinessBar,并赋值给指向BusinessBar类型的引用bb。
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法由程序员来指定参数动态返回需要的代理类,而invoke(Object proxy, Method method, Object[] args) 方法则是由JVM在运行时动态调用的。当执行“bb.bar("Hello,World");”方法时,JVM动态指派“调用处理器”,向外层invoke传递参数,并调用method.invoke(obj,args)真正执行!
BusinessImplProxy.Factory静态方法用来动态生成代理类(“代理角色”),在运行时根据不同的业务逻辑接口BusinessFoo和BusinessBar,在运行时分别动态生成了代理角色。“抽象角色”、“代理角色”以及调用处理器(实现InvocationHandler接口的类)这三者都可以改变,所以说JAVA的动态代理十分强大。
JAVA代理模式与动态代理模式相关推荐
- java动态代理_Java代理模式及动态代理详解
Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK原生动态代理. 代理模式 无 ...
- Java代理模式及动态代理详解
本文转自:程序新视界公众号 Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK ...
- Java内功修炼系列:代理模式及动态代理
目录 一 代理模式 1.1 简介 1.2 代理模式角色定义 二 静态代理 2.1 介绍和实例 2.2 静态代理的缺点 三 动态代理 3.1 基于JDK原生动态代理实现 四 小结 一 代理模式 1.1 ...
- Java篇 - 代理模式和动态代理实现原理
设计模式中有一种模式叫代理模式,Spring框架离不开动态代理技术,Android hook技术用到了反射 + 动态代理,Framework中我们也经常看到各种proxy,如ApplicationTh ...
- Java拾遗:007 - 代理模式与动态代理
2019独角兽企业重金招聘Python工程师标准>>> 代理模式 在日常开发中我们可以会接手一些老的项目,有时连源码都没有,或者有时候我会需要对业务逻辑做一定增强(功能扩展,如:日志 ...
- 代理模式、动态代理和面向方面
代理的意思很好理解,它借鉴了我们日常所用的代理的意思:就是本来该自己亲自去做的某件事,由于某种原因不能直接做,而只能请人代替你做,这个被你请来做事的人就是代理.比如过春节要回家,由于你要上班,没时间去 ...
- cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战
1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...
- 代理模式和动态代理模式_代理模式介绍
代理模式和动态代理模式 代表:被选中或当选为他人投票或代理的人– Merriam-Webster . 委托模式:在软件工程中,委托模式是面向对象编程中的一种设计模式,其中,一个对象而不是执行其陈述的任 ...
- 23种设计模式之代理模式(动态代理)
代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式的组成 抽 ...
- 方法功能增强 - 继承、装饰者模式、动态代理
引言 方法功能的增强是开发时常做的事情,当官方或者第三方提供的API不能满足我们的需要时,可以在原有API的基础上加上我们自定义的功能来实现需求. 码农阶段需要掌握的功能增强的方式有三种:继承 ...
最新文章
- VS.net2008正式版发布了
- Appium base knowledge
- mysql根据经纬度搜周边_mysql根据经纬度获取附近的商家
- 工业以太网交换机出现温度过高如何处理?
- linux自学笔记--DNS服务器
- paip.PHP-asp—jsp实现事件机制 WEBFORM式开发
- STM32学习心得一:FlyMcu软件配置(STM32串口下载软件)
- php侧边客服,利用jquery实现网页侧边栏在线客服代码
- 使用c语言打印九九乘法表
- js pug 代码_pug模板引擎(原jade)
- A Little Is Enough: Circumventing Defenses For Distributed Learning(绕过对分布式学习的防御)
- 智能红外遥控器(四):手机蓝牙控制格力风扇康佳加湿器
- 我与CSDN的2021 --从路人到一名万粉博主的自述
- 会计做什么副业好?分享几个适合会计的副业
- spring boot 源码解析23-actuate使用及EndPoint解析
- FFmpeg提取视频音乐
- 排名前6位的最流行的大数据框架,你在用哪一款?
- Go:Cos求余弦(附完整源码)
- Android开发,你必须知道的四大天王。
- [Python] openpyxl读存大数据 Exception: String longer than 32767 characters