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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java解析XML为对象「建议收藏」

    java解析XML为对象「建议收藏」详解Java解析XML的四种方法http://developer.51cto.com 2009-03-3113:12 cnlw1985 javaeye 我要评论()XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四种方法。
     
    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献

    2022年5月4日
    39
  • TerminateProcess函数简单使用示例[通俗易懂]

    TerminateProcess顾名思义,就是终止进程的意思。是WindowsAPI的函数,示例代码如下://Demo.cpp:定义控制台应用程序的入口点。//终止进程Demo#include”stdafx.h”usingnamespacestd;//@param:dwpid:指定需要关闭的进程pidintCloseProcess(DWORDdwpi…

    2022年4月7日
    118
  • acwing吧_并查集时间复杂度

    acwing吧_并查集时间复杂度小 A 和小 B 在玩一个游戏。首先,小 A 写了一个由 0 和 1 组成的序列 S,长度为 N。然后,小 B 向小 A 提出了 M 个问题。在每个问题中,小 B 指定两个数 l 和 r,小 A 回答 S[l∼r] 中有奇数个 1 还是偶数个 1。机智的小 B 发现小 A 有可能在撒谎。例如,小 A 曾经回答过 S[1∼3] 中有奇数个 1,S[4∼6] 中有偶数个 1,现在又回答 S[1∼6] 中有偶数个 1,显然这是自相矛盾的。请你帮助小 B 检查这 M 个答案,并指出在至少多少个回答之后可

    2022年8月9日
    4
  • SpiderMonkey-让你的C++程序支持JavaScript脚本

    SpiderMonkey-让你的C++程序支持JavaScript脚本

    2021年12月1日
    46
  • JavaWeb项目为什么我们要放弃JSP?为什么要前后端解耦?为什么要动静分离?[通俗易懂]

    JavaWeb项目为什么我们要放弃JSP?为什么要前后端解耦?为什么要动静分离?[通俗易懂]以前的项目大多数都是java程序猿又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/oracle等等)。

    2022年4月28日
    33
  • RabbitMQ入门:远程过程调用(RPC)

    假如我们想要调用远程的一个方法或函数并等待执行结果,也就是我们通常说的远程过程调用(RemoteProcedureCall)。怎么办?今天我们就用RabbitMQ来实现一个简单的RPC系统:客户

    2022年2月16日
    50

发表回复

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

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