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)
上一篇 2025年8月19日 下午2:01
下一篇 2025年8月19日 下午2:22


相关推荐

  • 定义和实现模板类不能在同一个文件

    定义和实现模板类不能在同一个文件

    2022年1月5日
    42
  • SpringBoot 实现热部署[通俗易懂]

    SpringBoot 实现热部署[通俗易懂]SpringBoot实现热部署1、添加依赖<!–热部署–><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><ver…

    2022年5月21日
    35
  • js网页特效

    js网页特效br 我平时特别喜欢研究网页特效 这里是平时 截流 下来的几个 JavaScript 网页特效 在此跟大家一起分享 br 反续排列 br 代码 在需要处加入 br nbsp br bdodir rtl 反续列 br 特点 当你需要把一段话反起来排列时 你怎么办呢 反起来一个一个地输入吗 只要使用以上代码 即可实现 br 自动刷新 br 代码 在网页的和之间加入 br metahttpequi refresh content

    2026年1月19日
    2
  • EXCEL 出错 8000401a

    EXCEL 出错 8000401a检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误:8000401a先用骨哥狗了一会,没解决方案,又用摆渡,也没找到方法,最后还是看微软的帮助解决了问题:1.打开DCOM配置,取消交互式用户,使用启动用户2.安全中附足够权限,不知道用户是谁就写Everyonehttp://suppo…

    2022年7月25日
    11
  • recv、recvfrom[通俗易懂]

    recv、recvfrom[通俗易懂]1、recvfrom()接收一个数据报并保存源地址。(这里是windows中的头文件,Linux的用法在下面的那个实例)头文件:#include  #includeintrecvfrom(ints,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen);s:标

    2022年7月23日
    34
  • 例解:集成测试用例与单元测试用例的区别

    例解:集成测试用例与单元测试用例的区别函数一 getMaxInTwo inta intb ifa breturna elsereturnb 函数二 getMaxInThre inta intb intc a a 1 intmax getMaxInTwo a b max getMaxInTwo max c 单元测试用例的设计 getMaxInTwo 的 UT 用例 3 2

    2026年3月16日
    3

发表回复

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

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