静态代理与Jdk动态代理
1、静态代理
/**抽象对象:声明了真实对象和代理对象的公共方法(男性情趣用品公司接口)*/public interface Subject {void saleTt();}/**真实对象:代理对象所代表的真实对象,最终被引用的对象(A情趣用品公司)*/public class RealSubject implements Subject {public void saleTt() {//....真实对象的处理方法}}/**代理对象:包含真实对象从而操作真实主题对象,相当于访问者和真实对象直接的中介(个人代购)*/public class Proxy implements Subject {private Subject subject;public Proxy(Subject subject) {this.subject = subject;}public void saleTt() {doBefore();//前置增强subject.saleTt();//真实对象的业务处理doAfter();//后置增强}}/**访问者:通过代理对象访问目标对象的方法(张三)*/public class Client {public static void main(String[] args) {Subject subject = new RealSubject();Proxy proxy = new Proxy(subject);proxy.saleTt();}}
静态代理使用代理类中的入参为真实对象的构造方法生成代理类,通过代理类的方法 去调用真实对象的方法;与特定的真实对象耦合,如果有新的需求,需要修改代理类 来实现。
- 不足之处: 扩展性差,可维护性差;
2、动态代理
/**抽象对象:声明了真实对象和代理对象的公共接口(公司接口)*/public interface ManToolsCompany {void saleManTool(String size);}/**真实对象:代理对象所代表的真实对象,最终被引用的对象(A公司,B公司)*/public class AaCompany implements ManToolsCompany {@Overridepublic void saleManTool(String size) {//...真实对象的业务处理}}/**代理对象:包含真实对象从而操作真实主题对象,相当于访问者和真实对象直接的中介(海外代购公司)*/public class LisonCompany implements InvocationHandler {//代理对象private Object compy;/**标注服务流程*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {doSomeThingBefore();//前置增强Object invoke = method.invoke(compy, args);//反射调用代购公司业务处理方法doSomeThingEnd();//后置增强return invoke;}//获取代理示例public Object getProxyInstance(){return Proxy.newProxyInstance(compy.getClass().getClassLoader(), compy.getClass().getInterfaces(), this);}}/**访问者:通过代理对象访问目标对象的方法(张三,张三媳妇)*/public class Client {public static void main(String[] args) {//真实对象ManToolsCompany aacomp = new AaCompany();WomanToolsCompany bbcomp = new BbCompany();//代理对象LisonCompany lisonCompany = new LisonCompany();lisonCompany.setCompy(aacomp);ManToolsCompany lison1 = (ManToolsCompany) lisonCompany.getProxyInstance();lison1.saleManTool("C");lisonCompany.setCompy(bbcomp);WomanToolsCompany lison2 = (WomanToolsCompany) lisonCompany.getProxyInstance();lison2.saleWomanTool(1.8f);ProxyUtils.generateClassFile(ManToolsCompany.class, lison1.getClass().getName());ProxyUtils.generateClassFile(WomanToolsCompany.class, lison2.getClass().getName());}}
动态代理的代理类实现特定InvocationHandler接口, 在类中使用Object类型的变量, 任何真实对象都可以传入,使用Proxy的静态方法newProxyInstance方法根据 传入Object类的类的相关信息(类加载器、实现的接口、当前对象)来生成真实对象的实例, 重写invoke方法,在invoke方法中调用真实对象的业务方法,在调用方法前后进行增强处理。 在通过代理类生成的真实对象的方法被调用时,调用了代理类中的重写的invoke方法,实现功能。
- 动态代理的优点: 不与特定的真实对象耦合,业务修改只需要增加新的真实对象,代理类不用修改。
JDK动态代理
Proxy:有资源的海外代购人(全职、兼职),调度中心,使用静态方法Proxy.newProxyInstance生成真实对象
InvocationHandler:优质的代购服务,提供标准服务,在invoke方法之前之后可以进行增强
类的完整生命周期
Java源文件(Java文件)–编译–>Java字节码(.class文件)–类加载–>Class对象–实例化–>实例对象—->卸载
.java源文件通过javac命令编译为.class字节码文件,通过类加载器ClassLoader加载全类名的.class文件在JVM中生成Class对象, 在new的时候通过Class对象实例化出对象实例进行使用,垃圾回收时实例对象的可达性分析与根节点没有关联时jvm卸载对象。
静态代理与Jdk动态代理相关推荐
- 一文理解JDK静态代理、JDK动态代理、Cglib动态代理
代理模式 通过代理来访问真实的对象,而不是直接去访问真正干活的对象,比如二房东租房,二房是代理者,而一房东才是真正的房东:或者说生活中的中介.Spring中的AOP就是动态代理 适用场景 需要动态修改 ...
- 静态代理,JDK动态代理,Cglib动态代理详解
目录 一.代理模式 二.静态代理 三.动态代理 3.1 JDK动态代理 3.2 Cglib动态代理 四.两种动态代理区别 一.代理模式 代理模式(Proxy Pattern)是程序设计中的一种设计模式 ...
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
Java之代理... 1 一. 概念... 1 二. jdk的静态代理... 1 三. jdk动态代理... 4 四. cglib 动态 ...
- Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理
前言 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 很多人至今都是看到 代理就懵, 静态代理.动态代理.JDK动态代理.CGL ...
- Spring系列:代理(jdk动态代理,cglib代理)
使用代理的目的: 1)为其他对象提供一种代理以控制对这个对象的访问. 2)方便系统的扩展和测试. 举例两个具体情况: (1)如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片 ...
- 静态代理和JDK动态代理
(开发环境是MyEclipse) 静态代理示例 HellowStaticProxy代理, HellowObject被代理 HellowObject和HellowStaticProxy实现iHellow ...
- java代理(静态代理和jdk动态代理以及cglib代理)
说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻的是,一次面试中,一位面试官问我,spring的AOP核心采用的设计模式是什么什么模式,阅读 ...
- 代理模式 静态代理、JDK动态代理、Cglib动态代理
1 代理模式 使用代理模式时必须让代理类和被代理类实现相同的接口: 客户端通过代理类对象来调用被代理对象方法时,代理类对象会将所有方法的调用分派到被代理对象上进行反射执行: 在分派的过程中还可以添加前 ...
- 代理模式(静态代理、jdk动态代理、CGLib动态代理)
目录 1.什么是代理模式? 2.静态代理 1.案例 2.优化案例 3.静态代理瓶颈 3.动态代理 1.什么是动态代理? 2.jdk动态代理 1.动态代理的工具类 匿名内部类简介 2.jdk动态代理实现 ...
最新文章
- get_headers()请求https报错解决思路
- mysql主从切换机制torch_Mysql主从复制 - osc_y0vjyklt的个人空间 - OSCHINA - 中文开源技术交流社区...
- Java+Windows+ffmpeg实现视频转换
- 线框模型_进行计划之前:线框和模型
- 容器化单页面应用中Nginx反向代理与Kubernetes部署
- echarts实现双Y轴之散点和折线图
- Shadow Defender 语言文件并注册
- 顶会ICML 2021杰出论文奖空降!
- leetcode力扣406. 根据身高重建队列
- Android学习之路五:Dialog和Toast
- 计算机组成原理-面试题
- 【C语言取反运算符】~2是多少?~-5是多少?
- 一个IT农民工分享互联网巨头公司面试流程
- Linux安装git报错make[1]: *** [perl.mak] 错误 2
- Oracle一次性查询超过1000条数据的方法(分批查询)
- 几种室内定位技术方案对比,室内定位种类的优缺点一目了然-新导智能
- 7. R语言【独立性检验】:卡方独立性检验、Fisher精确检验 、Cochran-Mantel-Haenszel检验
- ElementUI级联框回显问题
- 原生JS获取单选框或复选框的选中值的方法
- 思想的对象-The objects of thought