1. 动态代理


  • 动态代理就是通过代理类是代理类与相关接口不直接发生联系,而在运行期(Runtime)实现动态关联。
  • 动态代理主要用到java.lang.reflect包中的两个类,InvocationHandler接口和Proxy类。
  • 动态代理相较于静态代理最大的不同就是:动态代理的代理类不需要手动生成,该代理类是在运行期间动态生成的,这个动态生成的代理类已经实现代理对象的相关接口(Interface)。在生成代理类的同时,必须提供一个handler,这个handler有InvocationHandler提供,同时用来接管实际的工作。

2. InvocationHandler接口


(1)接口声明:
public interface InvocationHandler
  • 每一个动态代理类都必须实现InvocationHandler接口,InvocationHandler是代理实例(代理的真实对象),的调用处理程序实现的接口,当通过代理实例调用一个方法的时候,该方法的调用就会指派到它调用处理程序(InvocationHandler接口)的 invoke 方法。
(2)invoke方法声明:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
参数意义:Object proxy: 指代所代理的真实对象,也就是真实对象的代理Method method: 指代所调用的真实对象的某个方法的Method对象Object[] args: 指代所代理的真实对象某个方法的参数

3. Proxy类


(1)类声明:
public class Proxy extends Object implements Serializable
  • Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类(JDK).
  • Proxy类根据已经提供的相关接口和被代理的类就可以利用反射机制得到实现的方法,根据Proxy类的newProxyInstance(...)方法生成代理类。
(2)newProxyInstance方法声明:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException
参数意义:ClassLoader loader:   类加载器,就是把动态生成的代理类的字节码文件加载到JVM虚拟机中,一般使用被代理类的类加载器Class<?>[] interfaces:为代理对象提供的接口,就是被代理类实现的接口InvocationHandler h:  当代理对象调用方法的时候关联到InvocationHandler对象上,也就是前面说的*调用处理程序*(有待更深理解)

4.动态代理模式实现


package com.manu;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TestTrendsProxy {public static void main(String[] args) {Subject man = new Man();Proxy p = new Proxy(man);//通过java.lang.reflect.newProxyInstance(...)方法获得真实对象的代理对象Subject subject = (Subject)java.lang.reflect.Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), p);//通过代理对象调用真实对象相关接口中实现的方法,这个时候就会跳转到这个代理对象所关联的handler的invoke()方法去执行subject.shopping();   //获得真实对象的代理对象所对应的Class对象的名称,用字符串表示System.out.println(subject.getClass().getName());//调用处理程序的表示InvocationHandler handler = java.lang.reflect.Proxy.getInvocationHandler(subject);System.out.println(handler);}
}
//被代理人和代理人要执行的动作
interface Subject{void shopping();
}
//被代理类
class Man implements Subject{private String name="Tom";public void shopping() {System.out.println(name+"要去买东西...");}
}
//代理类
class Proxy implements InvocationHandler{private Object target;//要代理的真实对象public Proxy(Subject target){this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("proxy:"+proxy.getClass().getName());System.out.println("购买之前的评估工作...");method.invoke(target, args);System.out.println("购买之后的满意度调查...");return null;}
}

下面是运行结果:

运行结果:
proxy:com.manu.$Proxy0
购买之前的评估工作...
Tom要去买东西...
购买之后的满意度调查...
com.manu.$Proxy0
com.manu.Proxy@6bc7c054

运行结果中出现的$Proxy0是subject.getClass().getName())得到的,返回的是类的名称,这是在运行时动态创建的,命名方式貌似是$Proxy+编号构成。整个代理过程主要体现在一个handler上。

如果选择关注微信公众号:jzman-blog,一起交流学习!


关于java动态代理模式相关推荐

  1. java动态代理模式初解

    第一部分 1.代理模式的作用和定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用.  2.代 ...

  2. 设计模式之----Java动态代理模式

    在Spring中,有很多设计模式被应用,其中不乏代理模式.而代码模式中,就一定少不了动态代理模式.今天就对动态代理模式进行学习记录. 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托 ...

  3. Java动态代理InvocationHandler的一点感悟

    目录 初衷 动态代理 实例讲解 总结 初衷 在研究Retrofit源码中,在创建网络请求接口实例时,就是通过Java动态代理模式,动态生成网络请求接口的代理类,并将代理类的实例创建交给了Invocat ...

  4. 【Android架构师java原理详解】二;反射原理及动态代理模式

    前言: 本篇为Android架构师java原理专题二:反射原理及动态代理模式 大公司面试都要求我们有扎实的Java语言基础.而很多Android开发朋友这一块并不是很熟练,甚至半路初级底子很薄,这给我 ...

  5. Java的代理模式之静态代理和动态代理

    文章目录 静态代理 动态代理 jdk生成代理对象 cglib代理 代理模式简介: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目 ...

  6. JAVA代理模式与动态代理模式

    1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用. 代理模式给 ...

  7. java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)

    java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理     基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...

  8. 秒懂Java代理与动态代理模式

    版权申明]非商业目的可自由转载 博文地址:https://blog.csdn.net/shusheng0007/article/details/80864854 出自:shusheng007 设计模式 ...

  9. 设计模式之代理模式(静态代理、Java动态代理、Cglib动态代理)

    代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 提醒:动态代理中涉及到以前的一些知识 ...

最新文章

  1. python3并发编程基础
  2. Spring Boot中实现跨域的五种方式
  3. ALV设置参考表和参考字段,自定义列名称可能失效
  4. eclipse html页面校验,当我在Eclipse浏览器中运行url时,HTML表单未通过验证
  5. Apache PDFbox快速开发指南
  6. 《树莓派实战秘籍》——1.14 技巧14初学GPIO
  7. 专业的现场调音机架软件 - Deskew Technologies Gig Performer 4 Mac
  8. 1秒钟组装发动机,我震惊了
  9. windows Server 2012修复(CVE-2016-2183)(CVE-2013-2566)(CVE-2015-2808)
  10. 关于双非本科2020秋招,我想说的
  11. kingbase8建表
  12. 24种中文一流核心期刊
  13. (精讲)UVA - 1339 Ancient Cipher 刘汝佳紫书题单(算法竞赛入门经典)
  14. 恒定积自动做市--兑换比例,滑点,平均成本,资金进出对价格影响
  15. childNodes和children的区别
  16. 国内外常用公共NTP网络时间同步服务器地址
  17. 圣斗士星矢243年前的圣战详细介绍
  18. 太野了!西二旗程序员加班用CPU烤肉当夜宵
  19. 不积跬步无以至千里016
  20. vue 点击增大字号

热门文章

  1. 怎么把csdn博客白色的代码样式改成黑色且有个复制按钮的样式
  2. 牛客网JS(nodeJS)单行、多行输入和输出
  3. 炒股技术——指数,K线形态,分时,消息,行业板块,打板
  4. 案例 局部获取坐标位置 和全局获取坐标位置
  5. CCIE与HCIE哪个含金量高些?
  6. 年薪达 35 万元,杭州成为薪酬最高的城市,北上、重庆通勤时间最久,揭晓 2022 年最具潜力的软件名城!...
  7. Shader视差贴图
  8. 在vue组件的ts脚本中导入图片
  9. 中登公司统计数据好像有问题,看不懂。
  10. Cucumber之五Cucumber Options详解