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动态代理相关推荐

  1. 一文理解JDK静态代理、JDK动态代理、Cglib动态代理

    代理模式 通过代理来访问真实的对象,而不是直接去访问真正干活的对象,比如二房东租房,二房是代理者,而一房东才是真正的房东:或者说生活中的中介.Spring中的AOP就是动态代理 适用场景 需要动态修改 ...

  2. 静态代理,JDK动态代理,Cglib动态代理详解

    目录 一.代理模式 二.静态代理 三.动态代理 3.1 JDK动态代理 3.2 Cglib动态代理 四.两种动态代理区别 一.代理模式 代理模式(Proxy Pattern)是程序设计中的一种设计模式 ...

  3. Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)

    Java之代理... 1 一.         概念... 1 二.         jdk的静态代理... 1 三.         jdk动态代理... 4 四.         cglib 动态 ...

  4. Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理

    前言 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 很多人至今都是看到 代理就懵, 静态代理.动态代理.JDK动态代理.CGL ...

  5. Spring系列:代理(jdk动态代理,cglib代理)

    使用代理的目的: 1)为其他对象提供一种代理以控制对这个对象的访问. 2)方便系统的扩展和测试. 举例两个具体情况: (1)如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片 ...

  6. 静态代理和JDK动态代理

    (开发环境是MyEclipse) 静态代理示例 HellowStaticProxy代理, HellowObject被代理 HellowObject和HellowStaticProxy实现iHellow ...

  7. java代理(静态代理和jdk动态代理以及cglib代理)

    说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻的是,一次面试中,一位面试官问我,spring的AOP核心采用的设计模式是什么什么模式,阅读 ...

  8. 代理模式 静态代理、JDK动态代理、Cglib动态代理

    1 代理模式 使用代理模式时必须让代理类和被代理类实现相同的接口: 客户端通过代理类对象来调用被代理对象方法时,代理类对象会将所有方法的调用分派到被代理对象上进行反射执行: 在分派的过程中还可以添加前 ...

  9. 代理模式(静态代理、jdk动态代理、CGLib动态代理)

    目录 1.什么是代理模式? 2.静态代理 1.案例 2.优化案例 3.静态代理瓶颈 3.动态代理 1.什么是动态代理? 2.jdk动态代理 1.动态代理的工具类 匿名内部类简介 2.jdk动态代理实现 ...

最新文章

  1. get_headers()请求https报错解决思路
  2. mysql主从切换机制torch_Mysql主从复制 - osc_y0vjyklt的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. Java+Windows+ffmpeg实现视频转换
  4. 线框模型_进行计划之前:线框和模型
  5. 容器化单页面应用中Nginx反向代理与Kubernetes部署
  6. echarts实现双Y轴之散点和折线图
  7. Shadow Defender 语言文件并注册
  8. 顶会ICML 2021杰出论文奖空降!
  9. leetcode力扣406. 根据身高重建队列
  10. Android学习之路五:Dialog和Toast
  11. 计算机组成原理-面试题
  12. 【C语言取反运算符】~2是多少?~-5是多少?
  13. 一个IT农民工分享互联网巨头公司面试流程
  14. Linux安装git报错make[1]: *** [perl.mak] 错误 2
  15. Oracle一次性查询超过1000条数据的方法(分批查询)
  16. 几种室内定位技术方案对比,室内定位种类的优缺点一目了然-新导智能
  17. 7. R语言【独立性检验】:卡方独立性检验、Fisher精确检验 、Cochran-Mantel-Haenszel检验
  18. ElementUI级联框回显问题
  19. 原生JS获取单选框或复选框的选中值的方法
  20. 思想的对象-The objects of thought

热门文章

  1. 打标和权重推送 搜索权重推送 曝光率 低成本利用定向推广打爆首页流量
  2. STM32F1中断嵌套及内部中断详解——新浪博客迁移
  3. windows定时对指定文件夹压缩然后存放在指定的文件夹下
  4. JZOJ 3912. 超氧化钾
  5. 抖音矩阵系统,抖音SEO源码独立部署,look here
  6. 数据库查询速度优化 1 建立索引
  7. 尽量客观---对比G7和I9000
  8. 三菱PLC批量传送指令BMOV
  9. QQ表情收藏测试用例
  10. Android MediaPlay 常用方法介绍