代理模式-Java实现-静态代理、动态代理
目录
代理模式
静态代理
动态代理
代理模式
代理模式指的是一个类代表另一个类的功能,也就是一个类可以作为另一个类的代理。
代理模式属于结构型模式。
代理类不仅拥有真实类的功能,还可以提供一些额外的附加功能。
代理模式有两种:静态代理、动态代理。
静态代理
静态代理中,代理类是要显示声明的,而且代理类和真实类要实现同一个接口。
步骤 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实现-静态代理、动态代理相关推荐
- 两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)
代理模式及手写实现动态代理 一.代理模式 1. 定义 2. 示例 (1)静态代理 (2)动态代理 3. 通用类图 4. 代理模式的优点 二.jdk动态代理实现原理 1. jdk动态代理源码分析(通过该 ...
- 轻松学,Java 中的代理模式(proxy)及动态代理
我们先来分析代理这个词. 代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客 ...
- Spring : 静态代理模式和JDK、CGLIB动态代理
1.美图 2.概述 为了更好的分析分析Spring的另一个核心功能AOP,需要先温习一下动态代理的知识,如果对java的动态代理无所了解的话,那么对AOP源码的分析就无从谈起.代理模式可分为静态代理和 ...
- java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)
java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理 基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...
- 代理模式详解(静态代理和动态代理的区别以及联系)
原文链接:https://www.cnblogs.com/takumicx/p/9285230.html 1. 前言 代理模式可以说是生活中处处可见.比如说在携程上定火车票,携程在这里就起到了一个代理 ...
- ❤️Spring的静态、动态代理模式
❤️Spring的静态/动态代理模式 为什么要学习代理模式,因为AOP的底层机制就是动态代理! 代理模式: 静态代理 动态代理 1.静态代理 静态代理角色分析 抽象角色 : 一般使用接口或者抽象类来实 ...
- 代理模式:aspectj静态代理和jdk,cglib的动态代理的对比
1.使用jdk的动态代理来增强接口实现类. 原理:使用Proxy类的newProxyInstance方法运行期通过反射动态的生成代理对象 优点:不需要修改具体的业务代码,动态的增强方法,降低耦合性. ...
- Java高级编程细节-动态代理-进阶高级开发必学技能
关于代理模式的话题有很多, 在开发中经常用到的应该是静态代理模式,能很好的去耦合. 动态代理是代理模式的另外一种实现. 动态代理的区别在哪里? 动态代理有什么好处? 今天我们来分析下这些问题. 回顾静 ...
- java代理模式-原来你是这样的代理
这几天在看一些框架源码时看到了一个很奇妙的设计模式,有种熟悉个感觉,一时想不出是什么模式,后面经过了解才知道是动态代理,就这样带着好奇心学习了这个模式,更深入了解代理会发现不仅有静态和动态,还有很多其 ...
最新文章
- 滤波器的主要特性指标
- linux 查看mysql运行时间_linux – strace显示从mysql socket读取很长时间 – mysql需要很长时间才能执行查询?...
- b+树阶怎么确定_你知道危险品运输是怎么包装的吗?
- python编程项目中遇到的困难_python开发中遇到的常见问题,你们又是如何解决的呢?如何快速的学好python,有没有什么小技巧?...
- 为什么把devc++上的程序发到qq_微信上能登陆QQ了!腾讯QQ小程序使用体验
- C#串口通信工作笔记0002---上位机开发_嵌入式_串口助手_控制下位机的开关
- kvm虚拟机设置万兆网卡_kvm已经设置桥接网卡的虚拟机无法连接宿主机?
- 数据库SQL Server2012笔记(八)——Statement与PreparedStatement的区别,JDBC方式操作数据库...
- VBA 函数 过程之间互相调用的技巧
- AMAZINGIC晶焱CAN 总线收发器一致性测试
- 数学建模计算机部分知识,数学建模相关论文范文资料,与数学建模与计算机关系相关毕业论文题目范文...
- 网吧里电脑提示计算机内存不足,网吧电脑显示虚拟内存不足该怎么办呢
- netbeans开发php项目,NetBeans PHP 项目创建
- exec函数族的作用与讲解
- Spring获取上下文的四种方式方式
- 一行代码绘制高分SCI火山图
- 致青春触动心灵的英语美文——我们不是骄纵的孩子
- ffmpeg有gpl和lgpl版本,jetson硬件加速
- 可不可以在云服务器上安装虚拟机,云服务器可以安装虚拟机么
- [GXYCTF 2019]BabySqli