目录

代理模式

静态代理

动态代理


代理模式


代理模式指的是一个类代表另一个类的功能,也就是一个类可以作为另一个类的代理。

代理模式属于结构型模式。

代理类不仅拥有真实类的功能,还可以提供一些额外的附加功能。

代理模式有两种:静态代理、动态代理。

静态代理


静态代理中,代理类是要显示声明的,而且代理类和真实类要实现同一个接口。

步骤 1:创建真实类和代理类的公共接口

public interface CommonInterface {void action();
}

步骤 2:创建真实类、代理类

public class RealObject implements CommonInterface {@Overridepublic void action() {System.out.println("real object action invoke");}
}
public class ProxyObject implements CommonInterface {private CommonInterface realObject;@Overridepublic void action() {System.out.println("proxy : before action");    //代理对象的处理行为synchronized (this) {if (this.realObject == null) {this.realObject = new RealObject();}}this.realObject.action();   //调用真实对象的方法System.out.println("proxy :  after action");     //代理对象的处理行为}
}

步骤 3:使用代理类,而不是真实类

public class ProxyPatternDemo {public static void main(String[] args) {CommonInterface proxyObject = new ProxyObject();proxyObject.action();}
}

动态代理


如果有一个需求:项目中有多个不同的真实类,且这些真实类中的方法各不相同, 现在要记录每个方法执行所花费的时间。

如果使用静态代理,这实现起来非常繁琐,因为这些真实类的方法各不相同,需要对不同的真实类创建对应的代理类。

这时动态代理就可以发挥很好的作用,动态代理中,不需要对真实类创建代理类,只需要创建一个调用处理器类(InvocationHandler)即可。

调用处理器类表示一个具体的处理行为,如上面需求中的记录每个方法执行所花费的时间,这就是一个处理行为。

动态代理中的代理对象是动态创建的,在创建时需要指定一个调用处理器,表示该代理对象不仅拥有真实对象的功能,还可以记录每个方法执行所花费的时间。

J2EE的很多框架都使用了动态代理,如:Spring、Hibernate等。例如:要对Controller层中所有控制类增加一个功能,用于记录Get和Post方法的请求和响应的日志信息,可以使用Spring的AOP来实现,而AOP就是使用了动态代理。

可以使用Java反射包中的 InvocationHandler 和 Proxy 来实现动态代理,实现如下:

步骤 1:创建真实类的接口

public interface CommonInterface {void action();
}

步骤 2:创建真实类

public class RealObject implements CommonInterface {@Overridepublic void action() {System.out.println("real object action invoke");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}
}

步骤 3:创建代理使用的调用处理器

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class ProxyInvocationHandler implements InvocationHandler {private Object realObject;public ProxyInvocationHandler() {}public ProxyInvocationHandler(Object realObject) {this.realObject = realObject;}public void setRealObject(Object realObject) {this.realObject = realObject;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("proxy : before action");    //代理对象的处理行为System.out.println("[ real Object : " + this.realObject.getClass().getSimpleName() + " ]");System.out.println("[ invoke method : " + method.getName() + " ]");long startTime = System.currentTimeMillis();Object object = method.invoke(this.realObject, args);   //调用真实对象的方法long endTime = System.currentTimeMillis();System.out.println("spend time(ms) : " + (endTime - startTime));    //记录真实对象的方法执行所花费的时间System.out.println("proxy :  after action");     //代理对象的处理行为return object;}
}

步骤 4:使用代理对象,而不是真实对象

import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;public class DynamicProxyPatternDemo {public static void main(String[] args) {System.out.println(" --------- RealObject代理对象------------ ");CommonInterface realObject = new RealObject(); //真实对象ProxyInvocationHandler invocationHandler = new ProxyInvocationHandler(realObject);  //代理对象使用的调用处理器Class<?> classType = invocationHandler.getClass();   //Class对象,用于提供代理对象使用的类加载器CommonInterface proxyObject = (CommonInterface) Proxy.newProxyInstance(     //创建代理对象classType.getClassLoader(),     //类加载器realObject.getClass().getInterfaces(),  //代理对象使用到的接口invocationHandler);      //代理对象使用的调用处理器proxyObject.action();    //使用代理对象System.out.println(" ---------List代理对象------------ ");List<String> realList = new ArrayList<>();invocationHandler.setRealObject(realList);List<String> proxyList = (List<String>) Proxy.newProxyInstance(     //创建代理对象classType.getClassLoader(),     //类加载器realList.getClass().getInterfaces(),  //代理对象使用到的接口invocationHandler);      //代理对象使用的调用处理器proxyList.add("hello_world");    //使用代理对象System.out.println(proxyList.get(0));}
}

代理模式-Java实现-静态代理、动态代理相关推荐

  1. 两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)

    代理模式及手写实现动态代理 一.代理模式 1. 定义 2. 示例 (1)静态代理 (2)动态代理 3. 通用类图 4. 代理模式的优点 二.jdk动态代理实现原理 1. jdk动态代理源码分析(通过该 ...

  2. 轻松学,Java 中的代理模式(proxy)及动态代理

    我们先来分析代理这个词. 代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客 ...

  3. Spring : 静态代理模式和JDK、CGLIB动态代理

    1.美图 2.概述 为了更好的分析分析Spring的另一个核心功能AOP,需要先温习一下动态代理的知识,如果对java的动态代理无所了解的话,那么对AOP源码的分析就无从谈起.代理模式可分为静态代理和 ...

  4. java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)

    java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理     基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...

  5. 代理模式详解(静态代理和动态代理的区别以及联系)

    原文链接:https://www.cnblogs.com/takumicx/p/9285230.html 1. 前言 代理模式可以说是生活中处处可见.比如说在携程上定火车票,携程在这里就起到了一个代理 ...

  6. ❤️Spring的静态、动态代理模式

    ❤️Spring的静态/动态代理模式 为什么要学习代理模式,因为AOP的底层机制就是动态代理! 代理模式: 静态代理 动态代理 1.静态代理 静态代理角色分析 抽象角色 : 一般使用接口或者抽象类来实 ...

  7. 代理模式:aspectj静态代理和jdk,cglib的动态代理的对比

    1.使用jdk的动态代理来增强接口实现类. 原理:使用Proxy类的newProxyInstance方法运行期通过反射动态的生成代理对象 优点:不需要修改具体的业务代码,动态的增强方法,降低耦合性. ...

  8. Java高级编程细节-动态代理-进阶高级开发必学技能

    关于代理模式的话题有很多, 在开发中经常用到的应该是静态代理模式,能很好的去耦合. 动态代理是代理模式的另外一种实现. 动态代理的区别在哪里? 动态代理有什么好处? 今天我们来分析下这些问题. 回顾静 ...

  9. java代理模式-原来你是这样的代理

    这几天在看一些框架源码时看到了一个很奇妙的设计模式,有种熟悉个感觉,一时想不出是什么模式,后面经过了解才知道是动态代理,就这样带着好奇心学习了这个模式,更深入了解代理会发现不仅有静态和动态,还有很多其 ...

最新文章

  1. 滤波器的主要特性指标
  2. linux 查看mysql运行时间_linux – strace显示从mysql socket读取很长时间 – mysql需要很长时间才能执行查询?...
  3. b+树阶怎么确定_你知道危险品运输是怎么包装的吗?
  4. python编程项目中遇到的困难_python开发中遇到的常见问题,你们又是如何解决的呢?如何快速的学好python,有没有什么小技巧?...
  5. 为什么把devc++上的程序发到qq_微信上能登陆QQ了!腾讯QQ小程序使用体验
  6. C#串口通信工作笔记0002---上位机开发_嵌入式_串口助手_控制下位机的开关
  7. kvm虚拟机设置万兆网卡_kvm已经设置桥接网卡的虚拟机无法连接宿主机?
  8. 数据库SQL Server2012笔记(八)——Statement与PreparedStatement的区别,JDBC方式操作数据库...
  9. VBA 函数 过程之间互相调用的技巧
  10. AMAZINGIC晶焱CAN 总线收发器一致性测试
  11. 数学建模计算机部分知识,数学建模相关论文范文资料,与数学建模与计算机关系相关毕业论文题目范文...
  12. 网吧里电脑提示计算机内存不足,网吧电脑显示虚拟内存不足该怎么办呢
  13. netbeans开发php项目,NetBeans PHP 项目创建
  14. exec函数族的作用与讲解
  15. Spring获取上下文的四种方式方式
  16. 一行代码绘制高分SCI火山图
  17. 致青春触动心灵的英语美文——我们不是骄纵的孩子
  18. ffmpeg有gpl和lgpl版本,jetson硬件加速
  19. 可不可以在云服务器上安装虚拟机,云服务器可以安装虚拟机么
  20. [GXYCTF 2019]BabySqli

热门文章

  1. 定制 cobbler TITLE 信息
  2. Android WebView使用深入浅出
  3. 实用的设计模式【二】——类的组织
  4. 《ASP.NET 本质论》源码下载
  5. VS2017 控件添加关联变量
  6. Advanced R之数据结构
  7. 【语言处理与Python】4.7算法设计
  8. Flex in a Week系列视频教程中文版发布
  9. seam中格式化文本的处理
  10. PhpMyAdmin 配置文件现在需要一个短语密码的解决方法