JavaSE基础知识(十七)--Java动态代理中InvocationHandler中Object类型参数proxy的作用

news/2024/7/5 9:00:41

Java SE 是什么,包括哪些内容(十七)?

本文内容参考自Java8标准
再次感谢Java编程思想对本文的启发!
上一篇博文中详细说明了动态代理的内容,但是在说到调用处理器InvocationHandler的时候,有一个Object类型的参数proxy却没有用到。现在详细解释这个参数到底是干什么的。
我们来回顾一下调用处理器的代码(它是动态代理中一个固定的接口):

// 调用处理器
   //类MyHandler实现了接口InvocationHandler,这是动态代理的硬性规定。就得这么来
   //类似,如果你想拥有比较的能力,就得实现Comparable接口等
   public class MyHandler implements InvocationHandler{
      //被代理类对象的实例(在这个示例中指的就是被代理类Person的实例)
      private Object obj;
      //构造方法,带一个Object类型的形式参数
      public MyHandler(Object obj){
         //对象初始化(赋值)
         this.obj = obj;
      }
      //方法invoke,形式参数分别是
      //Obeject类型的proxy(我们现在重点需要关注的参数!)
      //Method类型的method(代表的是运行时调用的那个方法)
      //Object数组类型的args(代表的是运行时调用的那个方法的实际参数,可能一个或者多个,
      //所以是数组类型)
      public Object invoke(Object proxy, Method method, Object[] args)throws Throwable{
         //可能还有其他的代码...
         //通过Java的反射执行方法method(如果这里不明白,可以去找到我有关反射的博文,
         //了解如何通过反射执行一个方法).
         method.invoke(obj, args);
         //可能还有其他的代码...
         //返回null
         return null;
      }
   }

从上面的代码中,我们可以知道InvocationHandler接口中只有一个方法:invoke,它具有三个参数:
①、Object类型的proxy
②、Method类型的method
③、Object数组类型的args
其中Method类型的method参数代表的是实际运行时调用的方法(通过反射),Object数组类型的args参数代表的是实际运行时调用的方法的所有参数(通过反射)。唯一剩下的未被使用的参数是Object类型的proxy。
我们先从InvocationHandler接口的源码中找一找答案:
InvocationHandler源码!
从源码的解释中,我们可以知道proxy代表的是代理类的对象实例(一定要注意,代表的是代理类,不是被代理类!)。
再回到上一篇博文中的代码:
new Myproxy()就是代理类的实例!
从测试的代码中我们可以看到:最终使用的时候,是通过创建代理类的实例去调用目标方法。
所以,我们可以得出一个结论:
InvocationHandler接口的方法中,有一个专门代表代理类引用的参数,它就是Object类型的proxy。
主要有以下两个作用:
①、使用反射获取代理对象的信息(比如proxy.getClass().getName())。
②、返回代理对象以进行连续调用。
代码示例:
①、获取代理对象的信息:
获取代理对象的信息!
运行结果:
获取到了代理类的名称!
从代码和结果上看,这个参数是可以直接使用的,不需要再做额外的处理!
②、返回代理对象以连续调用:
要实现这个功能,首先你需要保证接口中的方法有返回值,并且返回的是接口类型!如果你调用返回类型是void的方法,是无法产生这种效果的。
代码示例:
接口中的方法返回接口类型:
方法返回的是接口类型!
调用处理器中返回代理对象的引用:
调用处理器中返回代理对象的引用!
测试:
连续调用测试!
PS:时间有限,有关Java SE的内容会持续更新!今天就先写这么多,如果有疑问或者有兴趣,可以加QQ:2649160693,并注明CSDN,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正


http://www.niftyadmin.cn/n/1982545.html

相关文章

JavaSE基础知识(十七)--Java复用代码之结合使用组合与继承(正确的初始化与清理)

Java SE 是什么,包括哪些内容(十七)? 本文内容参考自Java8标准 再次感谢Java编程思想对本文的启发! 在我们的日常编程工作中,同时使用组合与继承是很常见的事情,下面通过一个例子来说明: PS:同…

基于HTML5实现3D热图Heatmap应用

为什么80%的码农都做不了架构师?>>> Heatmap热图通过众多数据点信息,汇聚成直观可视化颜色效果,热图已广泛被应用于气象预报、医疗成像、机房温度监控等行业,甚至应用于竞技体育领域的数据分析。 http://www.hightopo…

JavaSE基础知识(十七)--Java复用代码之在组合与继承之间选择

Java SE 是什么,包括哪些内容(十七)? 本文内容参考自Java8标准 再次感谢Java编程思想对本文的启发! 通过前面的博文,我们了解到,组合与继承都允许在新的类中放置子对象,组合是显式地这么做,继承…

使用Hexo搭建自己的博客

2019独角兽企业重金招聘Python工程师标准>>> 参考文章 使用GitHub和Hexo搭建免费静态Blog http://wsgzao.github.io/post/hexo-guide 我的主题 https://github.com/ppoffice/hexo-theme-icarus hexo博客换主题--icarus http://hexo.trity.cc/2015/08/24/hexo%…

JavaSE基础知识(十七)--Java复用代码之关键字protected的详细描述

Java SE 是什么,包括哪些内容(十七)? 本文内容参考自Java8标准 再次感谢Java编程思想对本文的启发! 在博文"JavaSE基础知识(十六)–Java的访问权限控制关键字(public、protected、private)"中略微提及了关键字protected&#xff0…

.xyz域名总量TOP10:西部数码第四 排名升1位

IDC评述网(idcps.com)10月16日报道:根据ntldstats.com发布的最新数据显示,截止至2015年10月15日17时,国内外.xyz域名总量十强排名情况,相比上期9月28日,有所变动。西部数码、阿里云(…

JavaSE基础知识(十七)--Java复用代码之关键字final的详细描述

Java SE 是什么,包括哪些内容(十七)? 本文内容参考自Java8标准 再次感谢Java编程思想对本文的启发! 从某个方面来讲,关键字final的作用与关键字protected的作用是相反的。 根据上下文环境,Java的关键字final的含义和作…

yum或apt基本源设置指南

关于: 管理Linux服务器的运维或开发人员经常需要安装软件,最常用方式应该是通过Linux系统提供的包管理工具来在线安装,比如centos的yum,ubuntu或debian的apt-get。当然这些工具使用之前需要配置好yum源或apt源。 配置文件&#x…