Java中InvocationHandler接口中第一个参数proxy详解

Java中InvocationHandler接口中第一个参数proxy详解这两天在学习 Java 动态代理 上一篇文章我们详细的讲解了创建代理类的调用处理程序 实现 InvocationHa 接口的类 获得代理对象的 Proxy 类 但是就发现 InvocationHa 中的 invoke 方法中的第一个参数 proxy 好像从来没有用过 所以就开始在网上查询 proxy 的用途 最后在国外的网站上找到了不错的讲解 stackoverflo com 下面就根据自己的学习心得

上一篇文章我们详细的讲解了创建代理类的调用处理程序(实现InvocationHandler接口的类),获得代理对象的Proxy类,但是就发现InvocationHandler中的invoke方法中的第一个参数proxy好像从来没有用过,所以就开始在网上查询proxy的用途,最后在国外的网站上找到了不错的讲解stackoverflow.com,下面就根据自己的学习心得,讲解一下proxy。

1.讲解前我们先列一下我们要说明的问题
  • proxy代表什么意思
  • proxy参数怎么用及什么时候用
  • proxy参数运行时的类型是什么
  • 为什么不用this代替proxy
2.proxy代表什么意思

proxy是真实对象的真实代理对象,invoke方法可以返回调用代理对象方法的返回结果,也可以返回对象的真实代理对象(com.sun.proxy.$Proxy0)。

3.proxy参数怎么用及什么时候用

proxy参数是invoke方法的第一个参数,通常情况下我们都是返回真实对象方法的返回结果,但是我们也可以将proxy返回,proxy是真实对象的真实代理对象,我们可以通过这个返回对象对真实的对象做各种各样的操作。

  • 创建一个接口People,包含一个work方法,方法的返回对象是它本身
package com.test.Application; public interface People { public People work(String workName); public String time(); } 
  • 创建一个接口People的实现类Student
package com.test.Application; public class Student implements People{ 
    @Override public People work(String workName) { System.out.println("工作内容是"+workName); return this; } @Override public String time() { return "2018-06-12"; } } 
  • 创建一个代理类的调用处理程序WorkHandler
package com.test.Application; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class WorkHandler implements InvocationHandler{ 
    private Object obj; public WorkHandler(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before 动态代理..."); System.out.println(proxy.getClass().getName()); System.out.println(this.obj.getClass().getName()); if(method.getName().equals("work")) { method.invoke(this.obj, args); System.out.println("after 动态代理..."); return proxy; } else { System.out.println("after 动态代理..."); return method.invoke(this.obj, args); } } } 

我们可以看到上面的代理类调用处理程序打印了proxy参数对象,并且返回了proxy对象。

  • 客户端实例创建代理对象并输出结果
package com.test.Application; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { People people = new Student(); InvocationHandler handler = new WorkHandler(people); People proxy = (People)Proxy.newProxyInstance(people.getClass().getClassLoader(), people.getClass().getInterfaces(), handler); People p = proxy.work("写代码").work("开会").work("上课"); System.out.println("打印返回的对象"); System.out.println(p.getClass()); String time = proxy.time(); System.out.println(time); } } 

运行结果:

after 动态代理... before 动态代理... com.sun.proxy.$Proxy0 com.test.Application.Student 工作内容是上课 after 动态代理... 打印返回的对象 class com.sun.proxy.$Proxy0 class com.sun.proxy.$Proxy0 before 动态代理... com.sun.proxy.$Proxy0 com.test.Application.Student after 动态代理... 2018-06-12

我们可以看到WorkHandler代理调用处理程序打印proxy参数输出的结果是com.sun.proxy.$Proxy0,这也说明proxy参数是代理类的真实代理对象;Proxy类生成的代理对象可以调用work方法并且返回真实的代理对象,也可以通过反射来对真实的代理对象进行操作。

4.proxy参数运行时的类型是什么

上面我们已经打印出了proxy的类型是:com.sun.proxy.$Proxy0真实的代理对象

5.为什么不用this替代

因为this代表的是InvocationHandler接口实现类本身,并不是真实的代理对象。

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

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

(0)
上一篇 2026年3月18日 下午3:24
下一篇 2026年3月18日 下午3:24


相关推荐

  • 【Spring】总结Spring整合Mybatis的底层原理实现步骤[通俗易懂]

    【Spring】总结Spring整合Mybatis的底层原理实现步骤[通俗易懂]SpringMyBatisDao:数据访问层,提供让Service层调用的接口,更大的时候,Dao层可以是一个项目。sqlSession.getMapper();使用的是JDK的动态代理使用时自定注入的条件:要被Spring管理。被Spring管理的对象叫做Bean对象和Bean的区别:@Component注解表示将生成一个BeanBean就是一个Java对象,是Spring…

    2022年5月18日
    41
  • Agent、Skills、MCP 有什么区别?一篇讲透 AI 智能体的核心结构

    Agent、Skills、MCP 有什么区别?一篇讲透 AI 智能体的核心结构

    2026年3月15日
    2
  • 实战SpringBoot Admin

    实战SpringBoot Admin这里写目录标题声明动机前提声明 nbsp nbsp nbsp nbsp 该文章是针对于开发人员来讲 适用于实战 话不多说 直接上步骤 动机 nbsp nbsp nbsp nbsp 我已经发布一篇关于 Windos 上使用 Nacos 的文章了 Nacos 入驻与配置服务 然后私下想了想 干脆把 CentOs 上如何使用 Nacos 的文章也写一篇吧 然后这不 此文章就诞生了 前提

    2026年3月26日
    2
  • directshow是什么_direction arrow

    directshow是什么_direction arrow3.1DirectShow的功用(1)保证数据量庞大的多媒体数据处理的高效性;(2)时刻保持音频和视频的同步;(3)用简单的方法处理复杂的媒体源问题,包括本地文件,计算机网络,广播电视以及其他数码产品;(4)处理各种各样的媒体格式问题,包括AVI,ASF,MPEG,DV,MOV等;(5)支持目标系统中不可预知的硬件;DirectShow的设计初衷就是尽量要让

    2022年10月12日
    4
  • 无人驾驶感知篇之超声波雷达

    无人驾驶感知篇之超声波雷达昨天上海又新增了快六千多例,早上醒来的第一眼都很关注,这个时候,在想如果无人驾驶送餐车在各个街道行驶送餐那该多好,希望这一天能早点到来,让无人驾驶遍布咱们生活的每个角落。OK,言归正传,首先讲讲什么是超声波雷达。1.什么是超声波雷达安装在汽车周边的超声波雷达,主要用于倒车时的防撞报警系统,又俗称倒车雷达。超声波是一种在弹性介质中的机械振荡,纵向分辨率较高,对色彩、光照、电磁场不敏感,因此超声波测距系统对于黑暗,有灰尘或者烟幕、有毒等恶劣环境有很强的适应能力。超声波测距…

    2025年10月27日
    4
  • 状态模式「建议收藏」

    状态模式「建议收藏」状态模式

    2022年4月21日
    52

发表回复

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

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