InvocationHandler中invoke方法中的第一个参数proxy的用途

InvocationHandler中invoke方法中的第一个参数proxy的用途最近在研究 Java 的动态代理时对 invoke 函数的第一个参数一直不理解它的用处 某度搜索也搜不出结果 最后终于在 stackoverflo 上找到了答案 这是原文的链接 http stackoverflo com questions understandin proxy arguments of the invoke method of java lang reflec

最近在研究Java的动态代理时对InvocationHandler中invoke方法中的第一个参数一直不理解它的用处,某度搜索也搜不出结果,最后终于在stackoverflow上找到了答案。

这是原文的链接:http://stackoverflow.com/questions//understanding-proxy-arguments-of-the-invoke-method-of-java-lang-reflect-invoca

原文对这个参数的解释是:

1. 可以使用反射获取代理对象的信息(也就是proxy.getClass().getName())。

2. 可以将代理对象返回以进行连续调用,这就是proxy存在的目的,因为this并不是代理对象。

下面看源代码,完整代码:http://paste.ubuntu.com//

接口:

private interface Account { public Account deposit (double value); public double getBalance (); }

Handler:

private class ExampleInvocationHandler implements InvocationHandler { private double balance; @Override public Object invoke (Object proxy, Method method, Object[] args) throws Throwable { // simplified method checks, would need to check the parameter count and types too if ("deposit".equals(method.getName())) { Double value = (Double) args[0]; System.out.println("deposit: " + value); balance += value; return proxy; // here we use the proxy to return 'this' } if ("getBalance".equals(method.getName())) { return balance; } return null; } }

使用:

Account account = (Account) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] {Account.class, Serializable.class}, new ExampleInvocationHandler()); // method chaining for the win! account.deposit(5000).deposit(4000).deposit(-2500); System.out.println("Balance: " + account.getBalance());

我们看到如果返回proxy的话可以对该代理对象进行连续调用

那为什么不返回this,而是返回proxy对象呢?



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233077.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 到底什么是hash呢?hash碰撞?为什么HashMap的初始容量是16?

    到底什么是hash呢?hash碰撞?为什么HashMap的初始容量是16?一,到底什么是hash呢?作者:知乎用户链接:https://www.zhihu.com/question/26762707/answer/40119521来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。hash(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的…

    2022年6月16日
    43
  • 检测数据集(测试数据集是什么)

    AdvancedVideoandSignalbasedSurveillanceCoupledObjectDetectionandTrackingMichaelD.Breitenstein

    2022年4月13日
    44
  • [转载]下载网页中的ts视频文件

    [转载]下载网页中的ts视频文件目前来说,网上视频下载主要分为两大类,一类是大型正规网站,另一类就是第三方视频,基本上都是个人网站或者个人上传到网上的视频。第一类视频下载非常好办,只要下载安装官方客户端即可。第二类目前稍微复杂,目前主要的下载手段有通过浏览器视频嗅探插件、视频解析下载工具还有IDM嗅探下载。大家都知道,现在的视频网站播放技术主要以m3u8为主,这样的好处是用户点击暂停时即停止视频缓存,不造成宽带流浪占用浪费,同时也减轻了服务器的访问请求压力。这样做的坏处也很明显,嗅探软件不能嗅探完整的视频文件,嗅探到的也都是每

    2022年7月18日
    44
  • MyEclipse7.0破解下载

    MyEclipse7.0破解下载

    2021年11月16日
    66
  • DataGrip 2021.11.4激活码【2021免费激活】[通俗易懂]

    (DataGrip 2021.11.4激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月30日
    73

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号