• 1.动态代理是指客户通过代理类来调用其他对象(被代理类)的方法,并且是程序在运行时根据需要动态创建目标类的代理对象

    • 使用场合:调试、远程方法调用

    • 原理:使用一个代理将对象包装起来,然后用代理对象取代原始对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时将方法调用转到原始对象上

    • 代码:
//接口
interface Subject{void action();
}//被代理类
class RealSubject implements Subject{@Overridepublic void action() {System.out.println("我是被代理类,记得执行我...");}}//动态创建代理类,而不是直接实现Subject,想要动态创建代理类要使用到一个接口InvocationHandler
class MyInvocationHandler implements InvocationHandler{Object obj;//实现了接口的被代理类的对象的声明//该方法作用:①给被代理类的对象实例化②返回一个代理类对象public Object Blind(Object obj){//该类对象调用该方法时,传进去参数为一个对象this.obj = obj;//实现了创建对象功能:父类的obj声明指向每某个子类对象//动态的返回一个代理类对象,要用到另一个类(Proxy)的静态方法(newProxyInstance)去创建//该方法第一个参数动态获取被代理类类加载器,第二个参数动态是被代理类实现什么接口,//第三个是实现了InvocationHandler接口的类的对象return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);}//当代理类的对象发起对被重写的方法调用时,都会转换成调用如下方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object retrunValue = method.invoke(obj, args);return retrunValue;}}public class 动态代理 {public static void main(String[] args) {//1.创建被代理类对象 RealSubject rs = new RealSubject();//2.创建实现了InvocationHandler接口的类的对象,也就是MyInvocationHandlerMyInvocationHandler mih = new MyInvocationHandler();//3.调用blind()方法,动态的返回一个同样的实现了-对象rs所在类 -实现的接口的代理类的对象//或则说动态返回一个对象,这个对象是和被代理类实现相同接口的代理类创建的Object obj = mih.Blind(rs);Subject sub = (Subject)obj;//此时sub就是代理类的对象sub.action();//调用action()方法,会自动转到实现InvocationHandler接口的实现 类中invoke方法的调用//再写一个例子,被代理类对象NikeClothFactory ncf = new NikeClothFactory();ClothFactory cf = (ClothFactory)mih.Blind(ncf);cf.protectCloth();}}
  • 2.静态代理模式:代理和被代理是成对出现的,有点麻烦

    • 功能:生产衣服
//接口
interface ClothFactory{void protectCloth();
}//被代理类
class NikeClothFactory implements ClothFactory{@Overridepublic void protectCloth() {System.out.println("Nike工厂生产一批衣服");}
}
//代理类
class ProxyClothFactory implements ClothFactory{ClothFactory cf;//创建代理类对象时,实际传入一个被代理类的对象public ProxyClothFactory(ClothFactory cf){this.cf = cf;}@Overridepublic void protectCloth() {System.out.println("代理费100,代理类开始执行...");cf.protectCloth();}}public class 静态代理 {public static void main(String[] args) {NikeClothFactory nc = new NikeClothFactory();//创建被代理类对象ProxyClothFactory pc = new ProxyClothFactory(nc);//创建代理类对象pc.protectCloth();//此时调用的方法为被代理类中的方法}}

转载于:https://www.cnblogs.com/tengpengfei/p/10453996.html

反射(3)—动态、静态代理相关推荐

  1. 浅谈动态代理和静态代理的底层原理及实现

    什么是反射,反射的作用是什么 ​ Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用 ...

  2. Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了

    动态代理与静态代理 前言 代理模式 静态代理 动态代理 JDK代理 动态生成代理对象原理 生成class数据源码 动态代理类真身 总结 前言 近期在研究Hook技术,需要用到动态代理,说到动态代理就会 ...

  3. 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...

  4. 面试官:什么是静态代理?什么是动态代理?注解、反射你会吗?

    前言 开场 一位穿着蓝色衬衫,牛仔裤,拿着一个白色保温杯的中年男子急匆匆地坐在你对面,看样子是项目上的东西很急,估摸面试时间不会太长,这样一想心情放松了许多-(后来我就被打脸了) ​ ​ 面试开始 面 ...

  5. 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库

    文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...

  6. 【java反射】简单说说静态代理和动态代理

    在上篇博客中,我们说了反射的原理和简单应用,这次我们说说反射更深一层的应用,即动态代理. 代理模式 定义 代理模式是为其他对象提供一种代理以控制对这个对象的访问.代理模式分为静态代理和动态代理. 原理 ...

  7. 支撑Java框架的基础技术:泛型,反射,动态代理,cglib

    以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型,反射同时对于一些高级技术例如动态代理,cglib和字节码技术也需要掌握,下面就按章节来一一说清楚这些技术的核心部分,最后手写 ...

  8. java静态代理与动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式是java常见的设计模式.其目的是为其他对象提供一个代理以控制对某个真实对象的访问.通过代理类这一中间层,有效控制对真 ...

  9. 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

    这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并 ...

最新文章

  1. 第二阶段团队项目冲刺站立会议(九)
  2. WPF 问题 PresentationCore.dll!System.Windows.Media.Composition.DUCE.Channel.SyncFlush() 分析
  3. jQueryEasyUi验证
  4. 「offer来了」浅谈前端面试中开发环境常考知识点
  5. oracle sequence 不同 会话 不连续_序列 Sequence
  6. 一键生成通讯录的软件_橙瓜码字自动写作软件,外貌描写对话描写一键生成
  7. Android开发在路上:少去踩坑,多走捷径
  8. rehl7安装mysql5.7_Linux RPM包安装总结
  9. 阿里正在研发无人卡车;《王者荣耀》皮肤个性动作涉嫌抄袭致歉;​苹果泄露女生私密照赔偿数百万美元|极客头条...
  10. RecyclerView onClick
  11. adb 连接某个wifi_使用adb命令连接WiFi进行无线调试
  12. Windows自带的【远程桌面连接】操作方法及常见问题
  13. 未来十年最紧缺的职业
  14. iOS---Local declaration of hides问题
  15. 笑对过往、活在当下、期盼未来
  16. WPF 绑定继承的样式提示 只能根据带有基类型 IFrameworkInputElement 的目标类型的 Style 样式
  17. 《Kinect应用开发实战:用最自然的方式与机器对话》一3.5 从深度图像到骨骼图...
  18. C语言示例,三个骰子
  19. 常见到的mark到底是什么意思
  20. 物联lot是什么意思_新一代基于物联网NB-loT技术的智能共享单车解决

热门文章

  1. 程序员:凭什么他大专12K,而我硕士研究生才5K?
  2. 学好前端的 6 点建议,企业需要什么样的Web前端人才?
  3. 前端基础:vue.js跟node.js分别是什么
  4. 平凡函数依赖是什么?
  5. VS2019 配置QT
  6. android文件搜索广播,Android 实现无网络传输文件
  7. 9 Node 中的 TensorFlow.js
  8. 监控视频转发方案探讨-内网转外网
  9. 视频列表页html,视频列表.html
  10. C语言小知识---printf()函数