举例:

  • jdk自带动态代理
  • javaassit字节码操作库实现
  • CGLIB
  • ASM底层操作

实际例子:

使用jdk自带动态代理

  • java.lang.reflect.Proxy 作用

    • 动态生成代理类和对象
  • java.lang.reflectInvocationHander
    • 可以通过invoke方法实现对真实角色的代理访问
    • 每次通过Proxy生成代理类对象对象时都要指定对应的处理器对象
  1. package com.littlepage.DynamicProxyParttern;
  2.  
  3. public interface Star {
  4. //面谈
  5. void confer();
  6. //签合同
  7. void signContract();
  8. //订票
  9. void bookTicket();
  10. //唱歌
  11. void sing();
  12. //收钱
  13. void collectMoney();
  14. }
  1. package com.littlepage.DynamicProxyParttern;
  2.  
  3. public class RealStar implements Star{
  4.  
  5. @Override
  6. public void confer() {
  7. System.out.println("Real Star Confer");
  8. }
  9.  
  10. @Override
  11. public void signContract() {
  12. System.out.println("Real Star SignContract");
  13. }
  14.  
  15. @Override
  16. public void bookTicket() {
  17. System.out.println("Real Star BookTicket");
  18. }
  19.  
  20. @Override
  21. public void sing() {
  22. System.out.println("Real Star Sing");
  23. }
  24.  
  25. @Override
  26. public void collectMoney() {
  27. System.out.println("Real Star CollectMoney");
  28. }
  29.  
  30. }
  1. package com.littlepage.DynamicProxyParttern;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5.  
  6. public class StarHandler implements InvocationHandler{
  7. Star realStar;
  8.  
  9. public StarHandler(Star realStar) {
  10. this.realStar = realStar;
  11. }
  12.  
  13. @Override
  14. public Object invoke(Object proxy, Method method, Object[] args)//涉及反射
  15. throws Throwable {
  16. Object object=null;
  17. System.out.println("真正的方法执行");
  18. System.out.println("面谈,签合同,付款,订机票");
  19. if(method.getName().equals("sing")){
  20. method.invoke(realStar, args);//激活调用的方法
  21. }
  22. System.out.println("收尾款");
  23. return object;
  24. }
  25.  
  26. }
  1. package com.littlepage.DynamicProxyParttern;
  2.  
  3. import java.lang.reflect.Proxy;
  4.  
  5. public class Client {
  6. public static void main(String[] args) {
  7. RealStar rs=new RealStar();
  8. StarHandler sh=new StarHandler(rs);
  9. Star proxy=(Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, sh);
  10. proxy.sing();
  11. }
  12. }

运行结果:

原理图:

设计模式(八)Dynamic Proxy Parttern 动态代理模式的更多相关文章

  1. 基于jdk proxy的动态代理模式

    代理模式 是spring AOP机制的实现基础,有必要学习一下. 有两种,一种是目标类有接口的, 采用JDK动态代理,一种是目标类没接口的,采用CGLIB动态代理. 先看一组代码, package c ...

  2. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

  3. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  4. 代理模式(Proxy)--动态代理(CGLIB)

    上一篇:代理模式(Proxy)--动态代理(jdk) (1)CGLIB技术是第三方代理技术,可以对任何类生成代理,代理的原则是对目标对象进行继承代理 (2)如果目标对象被final修饰,则无法被CGL ...

  5. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...

  6. Java-马士兵动态代理模式

    Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候一般用不上,主要是为了面试和理解原理: java动态代理有什么作用 作用非常大,在很多底层框架中都会 ...

  7. Java静态代理与动态代理模式的实现

    前言:    在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总找不到时间去找他,他也没办法.后来,房东想了一个办法,他找到 ...

  8. java jdk动态代理模式举例浅析

    代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色. java中常用的动态代理模式为jdk动态代理和c ...

  9. iOS的动态代理模式的实现

    动态代理模式的应用很多,特别是在不能修改被代理类的前提下,要对执行某些方法时需要打log或者捕捉异常等处理时,是一个非常方便的方法.只需要少量修改客户端(场景类)代码和添加一个代理类就可以实现,这个符 ...

随机推荐

  1. SSMS登记密码清除

    如图,此界面的登录密码如果要清除,可以找到%AppData%\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin,将SqlStud ...

  2. plsql登录报错身份证明检索失败

    找到sqlnet.ora文件  在Oracle安装目录下    \product\12.2.0\dbhome_1\network\admin 把     SQLNET.AUTHENTICATION_S ...

  3. react将表格动态生成视频列表【代码】【案例】

    只需要创建一个表格,id为videos,react就能将这个表格转换成视频列表,并点击自动播放 index.html <!DOCTYPE html> <html> <he ...

  4. java321 面向对象编程

  5. corn

    http://www.cnblogs.com/itech/archive/2011/02/09/1950226.html service crond start ---查看crontab服务是否启动 ...

  6. mysql 汇总

    子查询:    select   a.id,a.hotelname,max(b.day) as day,a.hotelrankid,   c.hotelrank,min(b.basicprice) a ...

  7. curl命令基本使用小总结

    curl 下载文件 -o:将文件保存为命令行中指定的文件名的文件中 -O:使用URL中默认的文件名保存文件到本地 --limit-rate:限速 -C:对大文件使用断点续传功能 --silent:不显 ...

  8. Java利用JNI调用C/C++写成的DLL

    前言 由于学期作业的要求,笔者需要开发一个语音识别系统.出于对Java的热爱,笔者非常想用Java来写上层程序(前台+数据库的三层),又要用到Microsoft Speech SDK,所以在这些条件下 ...

  9. 移动端(微信等)使用 vConsole 调试 console

    参考链接:https://blog.csdn.net/m0_37036014/article/details/80113635

  10. 【Python52--爬虫1】

    一.Python如何访问互联网 采用urllib包来访问 二.理论 1.请问URL是“统一资源标识符”还是“统一资源定位符” URI是统一资源标识符,URL是统一资源定位符.即:URI是用字符串表示某 ...