位置: IT常识 - 正文

对java中代理的理解笔记(java代理有几种方式)

编辑:rootadmin
对java中代理的理解笔记 简单例子 package com.kfm.jdbc.day0328;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public interface Actor { void sing(double money); void jump(double money);}class Kun implements Actor{ @Override public void sing(double money) { System.out.println("收了" + money + "元,唱了一首《只因你太美》"); } @Override public void jump(double money) { System.out.println("收了" + money + "元,跳了一个舞"); }}class Agent implements Actor{ private Actor actor; public Agent(Actor actor){ this.actor = actor; } @Override public void sing(double money) { this.actor.sing(money * 0.8); } @Override public void jump(double money) { this.actor.jump(money * 0.9); }}class Main { public static void main(String[] args) { Kun kun = new Kun(); Actor o = (Actor) Proxy.newProxyInstance(Kun.class.getClassLoader(), new Class[]{Actor.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String name = method.getName(); if ("sing".equals(name)){ System.out.println("请他唱歌先请我吃饭"); return method.invoke(kun, args); } else { System.out.println("做其他事得加钱"); return method.invoke(kun, args); } } } ); o.sing(1.1); o.jump(2.2);// Agent agent = new Agent(kun);// agent.sing(50000); }}对例子进行分析:有一个actor的接口,有jump和sing两个方法ikun实现了此接口但是你能直接见到IKUN吗???因此需要一个agent也来实现actor接口,但是,agent需要赚一点差价现在在代码每次运行时,来一个agent,因此就用到代理:

推荐整理分享对java中代理的理解笔记(java代理有几种方式),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java 代理对象,java代理cglib,java代理类应用场景,java代理有几种方式,java代理有几种方式,java 代理对象,java代理有几种方式,java中代理的作用,内容如对您有帮助,希望把文章链接给更多的朋友!

在 Main 类中,首先创建了一个 Kun 对象 kun,然后使用 Java 反射机制,创建了一个代理对象 o,代理的是 Kun 类。在代理对象的创建过程中,传入了 Kun 类的类加载器、Actor 接口的 Class 对象和一个 InvocationHandler 对象。这个 InvocationHandler 对象的作用是拦截代理对象方法的调用,对调用进行增强。在 invoke 方法中,首先判断调用的方法是 sing 还是 jump,如果是 sing 方法,则输出一条信息“请他唱歌先请我吃饭”,然后再调用 kun 对象的 sing 方法。如果是 jump 方法,则输出一条信息“做其他事得加钱”,然后再调用 kun 对象的 jump 方法。最后,通过代理对象 o 调用了 sing 和 jump 方法。在这个示例中,代理对象 o 拦截了 sing 和 jump 方法的调用,对 sing 方法进行了增强,输出了一条信息,而对 jump 方法没有进行增强,只是输出了一条提示信息。

对java中代理的理解笔记(java代理有几种方式)

Proxy.newProxyInstance 是 Java 动态代理的一个方法,用于创建代理对象。它有三个参数:

ClassLoader 类加载器,用于加载代理对象的 Class 文件。 Class<?>[] interfaces,被代理对象实现的接口列表,这些接口必须是非 final 类型。 InvocationHandler invocationHandler,实现了 InvocationHandler 接口的对象,用于拦截代理对象的方法调用并进行增强。 在这段代码中,Kun.class.getClassLoader() 表示使用 Kun 类的类加载器来加载代理对象的 Class 文件。new Class[]{Actor.class} 表示要代理的接口列表,这里只有 Actor 接口。new InvocationHandler() 表示实现了 InvocationHandler 接口的对象,这里使用了匿名内部类来实现。在这个匿名内部类中,重写了 invoke 方法,用于拦截代理对象的方法调用并进行增强。

最后,将代理对象强制转换为 Actor 类型,并将其赋值给 o 变量,o 可以调用 Actor 接口中的方法,实际上调用的是被代理对象 Kun 的对应方法,而 InvocationHandler 中的增强操作也会被执行。

invoke() 方法是 InvocationHandler 接口中的一个方法,用于拦截代理对象的方法调用并进行增强。它有三个参数:

Object proxy,代理对象本身,通常在 invoke() 方法中不会使用到。 Method method,代理对象被调用的方法对象。 Object[] args,代理对象被调用的方法的参数列表。 在这段代码中,invoke() 方法首先通过 Method 对象获取被调用方法的名字,然后判断被调用的方法是 sing 还是其他方法。如果是 sing 方法,就输出一句话并调用被代理对象 Kun 的 sing() 方法,并将其返回值作为 invoke() 方法的返回值。如果是其他方法,就输出另一句话并调用被代理对象 Kun 的对应方法,并将其返回值作为 invoke() 方法的返回值。

因此,当代理对象 o 调用 sing() 方法时,实际上会调用 invoke() 方法,并在其中输出一句话,并调用被代理对象 Kun 的 sing() 方法,并将其返回值作为 o.sing() 的返回值。当代理对象 o 调用 jump() 方法时,实际上也会调用 invoke() 方法,并在其中输出另一句话,并调用被代理对象 Kun 的 jump() 方法,并将其返回值作为 o.jump() 的返回值。

本文链接地址:https://www.jiuchutong.com/zhishi/300151.html 转载请保留说明!

上一篇:目标检测算法——图像分割数据集汇总(附下载链接)(一阶段目标检测算法)

下一篇:前端实现分页效果(前端分页显示)

  • word文档如何调出字体工具栏(word文档如何调行高度)

    word文档如何调出字体工具栏(word文档如何调行高度)

  • 藏易通怎么添加家庭成员(藏易通怎么添加没有身份证的成员)

    藏易通怎么添加家庭成员(藏易通怎么添加没有身份证的成员)

  • 快手直播怎么挂小黄车(快手直播怎么挂小铃铛)

    快手直播怎么挂小黄车(快手直播怎么挂小铃铛)

  • vivo手机语音播报在哪里关闭(vivo手机语音播报怎么开启)

    vivo手机语音播报在哪里关闭(vivo手机语音播报怎么开启)

  • 抖音粉丝暂不支持查看怎么回事(为什么抖音提示粉丝未授权)

    抖音粉丝暂不支持查看怎么回事(为什么抖音提示粉丝未授权)

  • 为什么苹果手机不能下载刷宝视频(为什么苹果手机信号弱)

    为什么苹果手机不能下载刷宝视频(为什么苹果手机信号弱)

  • 荣耀play4tpro充电速度(荣耀play4tpro充电器多少w)

    荣耀play4tpro充电速度(荣耀play4tpro充电器多少w)

  • 怎样提高电脑速度(怎样提高电脑速度快)

    怎样提高电脑速度(怎样提高电脑速度快)

  • wifi信号增强方法(wifi信号增强方法大全图解)

    wifi信号增强方法(wifi信号增强方法大全图解)

  • iphone11屏幕旋转怎么设置(iphone11屏幕旋转失灵)

    iphone11屏幕旋转怎么设置(iphone11屏幕旋转失灵)

  • 微信怎么不要图片就可以发表

    微信怎么不要图片就可以发表

  • 淘宝你充值过的人是什么意思(淘宝充值中心充值记录能不能删除)

    淘宝你充值过的人是什么意思(淘宝充值中心充值记录能不能删除)

  • 小红书被限流会提示吗(小红书被限流会自动恢复吗)

    小红书被限流会提示吗(小红书被限流会自动恢复吗)

  • 华为手机怎么关闭健康使用手机(华为手机怎么关空调)

    华为手机怎么关闭健康使用手机(华为手机怎么关空调)

  • 苹果手表出现红色叹号(苹果手表出现红色苹果logo)

    苹果手表出现红色叹号(苹果手表出现红色苹果logo)

  • 通过快手号能找到对方的QQ号和微信号吗(通过快手号能找到那个人的位置吗)

    通过快手号能找到对方的QQ号和微信号吗(通过快手号能找到那个人的位置吗)

  • mate30pro自带贴膜吗(华为mate30pro自带贴膜)

    mate30pro自带贴膜吗(华为mate30pro自带贴膜)

  • 电脑键盘打不出字母只能打出数字(电脑键盘打不出来数字怎么办)

    电脑键盘打不出字母只能打出数字(电脑键盘打不出来数字怎么办)

  • 蓝牙耳机和有线耳机哪个耗电(蓝牙耳机和有线耳机可以一起用吗)

    蓝牙耳机和有线耳机哪个耗电(蓝牙耳机和有线耳机可以一起用吗)

  • 超高清4k是什么意思(超高清4k和4k有什么区别)

    超高清4k是什么意思(超高清4k和4k有什么区别)

  • 手机桌面上的时间和天气不见了(手机桌面上的时间怎么设置出来)

    手机桌面上的时间和天气不见了(手机桌面上的时间怎么设置出来)

  • 怎么验证airpods2真假(怎么验证airpods序列号)

    怎么验证airpods2真假(怎么验证airpods序列号)

  • 微信拆红包声音怎么设置(微信拆红包声音怎么关掉小米手机)

    微信拆红包声音怎么设置(微信拆红包声音怎么关掉小米手机)

  • rcapi.exe - rcapi是什么进程 有什么用

    rcapi.exe - rcapi是什么进程 有什么用

  • 延期缴税申请需要先申报吗?
  • 帮忙劳务派遣
  • 货款不入公司账户属什么行为
  • 部分红冲的发票怎么开
  • 股东股权转让印花税公司可以报销吗
  • 如何认定纳税人资格证书
  • 黄金珠宝加工怎么样
  • 土地评估费计入什么会计科目
  • 其他业务收入记账凭证怎么写
  • 申请一般纳税人需要多长时间
  • 去税务局税种认定需要带什么资料
  • 关于两套账老板和会计须知的4个点
  • 预警期内的应收账款管理
  • 小企业处置固定资产
  • 拿提成的工资怎么算
  • 融资融券主要是哪些对象
  • 无偿赠送资产需要交哪些税
  • 出口退税申报时间限制
  • 固定资产折旧怎么做记账凭证
  • 无法连接到移动网络小米
  • 如何自己打造一台高赛摩托车
  • 虚拟机安装apache
  • vue+cesium怎么实现地图的加载
  • php字符串函数有哪些
  • 固定资产减值判断标准
  • 公司给员工发放的福利都要扣个税吗
  • 开发票金额少于付款金额差额怎么入账?
  • yolov5 教程
  • 收据中代收款凭证
  • 微信小程序开发完整项目
  • 如何快速使用验证码
  • 无纸化办理
  • 微信支付高速通行费怎么开电子发票
  • pythontime模块
  • php图片库
  • 私对公可以转账吗?会对做账不利吗
  • 个人所得税专项附加扣除赡养老人
  • 大学生创新创业平台
  • 合并报表中的抵损益
  • 年金现值和终值的计算
  • 个人提供劳务增值税专用发票
  • 固定资产直接进费用表示表示一次性计提折旧
  • 金税盘维护费应该计入什么科目
  • 水电费的会计分录
  • 制单会计岗位风险点
  • 提取备用金记账凭证号的入账范围
  • 未开票收入如何结转成本
  • 订单式生产的企业有哪些
  • 空调安装开发票
  • 营业费用和营业支出
  • 未确认融资费用借贷方向
  • 三证合一后税务怎么办
  • 保险公司理赔款如何入账
  • 残保金怎么办理
  • mysql改造
  • windows帮助文件是什么
  • win10应用商店下载路径更改
  • 资源管理器操作教程
  • 为快捷方式建立快捷方式
  • Win10怎么关闭任务栏搜索
  • u盘安装linux系统遇到的问题
  • win10桌面版微信连不上网
  • linux界面显示
  • mac命令行窗口怎么打开
  • centos6设置ip
  • macos的磁盘
  • win10网络共享失败
  • 深入理解linux内核第三版
  • javascript新手教程
  • 现在最流行的是啥
  • android EditText 需要输入文本时调不出来软键盘 解决方案(亲测有效)
  • 网络游戏数据包
  • vue3目录解析
  • android线程间通信的几种方法
  • unity3d武器模型
  • js实现手风琴
  • js检测类型的方法
  • python 如何访问数据库
  • 江苏省国家税务局总局官网
  • 会议服务费属于什么类别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设