位置: 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 转载请保留说明!

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

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

  • 微信群邀请人数上限是多少(微信群邀请人数统计软件)

    微信群邀请人数上限是多少(微信群邀请人数统计软件)

  • 苹果耳机为啥一直闪白灯(苹果耳机为啥一个有电一个没电)

    苹果耳机为啥一直闪白灯(苹果耳机为啥一个有电一个没电)

  • 打电话显示线路忙什么意思(打电话显示线路异常)

    打电话显示线路忙什么意思(打电话显示线路异常)

  • vivo隐藏软件怎么弄(vivo隐藏软件怎么显示出来)

    vivo隐藏软件怎么弄(vivo隐藏软件怎么显示出来)

  • 为什么苹果充值不了(为什么苹果充值显示付款方式被拒)

    为什么苹果充值不了(为什么苹果充值显示付款方式被拒)

  • 所有来电都显示同一个号码(所有来电都显示私密号码怎么办)

    所有来电都显示同一个号码(所有来电都显示私密号码怎么办)

  • 微信左上角有个蓝色圆点(微信左上角有个箭头)

    微信左上角有个蓝色圆点(微信左上角有个箭头)

  • 荣耀play3充电指示灯怎么开(荣耀play3充电显示设置)

    荣耀play3充电指示灯怎么开(荣耀play3充电显示设置)

  • qq如何自动回复好友(qq如何自动回复群消息)

    qq如何自动回复好友(qq如何自动回复群消息)

  • plc组态是什么意思(什么是plc组态软件)

    plc组态是什么意思(什么是plc组态软件)

  • vivoy66长宽高多少(vivoy66尺寸多大)

    vivoy66长宽高多少(vivoy66尺寸多大)

  • 怎么清除电脑上所有的内容(怎么清除电脑上微信的数据)

    怎么清除电脑上所有的内容(怎么清除电脑上微信的数据)

  • 计算机软件主要包括哪些(计算机软件主要分为什么和什么)

    计算机软件主要包括哪些(计算机软件主要分为什么和什么)

  • mate30支持灭屏显示吗

    mate30支持灭屏显示吗

  • 拼多多换货有运费补吗(拼多多换货有运费险还要钱吗)

    拼多多换货有运费补吗(拼多多换货有运费险还要钱吗)

  • 在哪设置群名片(群成员名片怎么弄)

    在哪设置群名片(群成员名片怎么弄)

  • qq音乐上可以改qq密码吗(qq音乐怎么改用户名)

    qq音乐上可以改qq密码吗(qq音乐怎么改用户名)

  • 微信群能查邀请记录吗(微信群怎么查邀请记录)

    微信群能查邀请记录吗(微信群怎么查邀请记录)

  • 耳机反磁是什么意思(蓝牙耳机的反磁是什么意思)

    耳机反磁是什么意思(蓝牙耳机的反磁是什么意思)

  • 如何在快手把喜欢的作品置顶到第一个(怎么把快手里的喜欢全部删除)

    如何在快手把喜欢的作品置顶到第一个(怎么把快手里的喜欢全部删除)

  • qq音乐登陆昵称怎么改(qq音乐更换登录用户名)

    qq音乐登陆昵称怎么改(qq音乐更换登录用户名)

  • 华为p30pro双卡怎么插(华为p30pro双卡怎么插视频)

    华为p30pro双卡怎么插(华为p30pro双卡怎么插视频)

  • wps自动备份

    wps自动备份

  • 最贵的U盘是什么(贵的u盘和便宜的有什么区别)

    最贵的U盘是什么(贵的u盘和便宜的有什么区别)

  • 预收账款属于什么科目借贷方向
  • 异地预缴怎么做账
  • 开办期间的费用,没有发票,咋抵扣啊
  • 支付外国公司费用要交税吗
  • 税控系统技术维护费可以抵扣吗
  • 合伙企业借款利息收入个税
  • 增值税清卡失败什么原因
  • 企业放贷利息收多少合适
  • 以前年度税款需要交税吗
  • 法人存入公户实收资本可以还其他应付款吗
  • 企业月奖金发放制度
  • 股份支付为什么计入资本公积?
  • 应付债券利息调整科目理解
  • 合同印花税如何做账
  • 预缴所得税如何做账
  • 价税合计啥意思
  • 发票二维码压线可以用吗
  • 入职不满一年有年假吗
  • 基金会可以投资企业吗
  • 团队建设费用怎么入账
  • 企业所得税减免所得税额怎么算
  • 公司账上亏损
  • 1697508669
  • 移动通信定额发票
  • 转让长期股权投资怎么算
  • 社保公积金外包对员工的利弊
  • 固定资产减值测试时预计其未来现金流量不应考虑的因素
  • 红字发票只能一张一张开吗
  • mce文件是什么软件
  • giantantispywaremain.exe是什么进程 有什么作用 giantantispywaremain进程查询
  • 减免税款怎么做账务处理
  • 在承租土地上建房是否应核算为固定资产会计视野
  • 增值税如何在报表里填写
  • php传值和传引用的区别
  • 苏格兰高地什么意思
  • php自动执行函数
  • 什么是技术服务工程师
  • yolov7训练自己的模型用 flask封装
  • vue里的for循环
  • 红字发票账务处理
  • phpcms v9官网
  • 建筑业总包增值税
  • 企业计提养老保险分录
  • 销售服饰
  • 出口退税方法相关文献
  • java操作mongodb数据库
  • mongodb常见问题
  • 呆账核销账务处理程序
  • 建安类企业包括哪些公司
  • sql server 创建数据表状态1第三行语法错误怎么回事
  • sql编程软件哪个好用
  • 养殖类合作社
  • 预付账款用途
  • 小规模纳税人的增值税计入成本吗
  • 代收通行费不征税吗
  • 装修费用一次性摊好还是分期好
  • 现金流量补充表的应付项目是什么
  • 空调的折旧年限一般是多少年
  • 其他综合收益不影响当期损益
  • 税务局退款会计分录
  • windows7 ip地址冲突
  • win8打开屏幕键盘
  • 数据中心为什么要建在山洞里
  • 系统win8
  • 在linux中,要解包bugzilla.tar.gz
  • awk正则表达式中引入变量
  • ubuntu如何打开
  • linux的kill函数
  • linux网络设备有哪些
  • 近期win7蓝屏
  • android app启动过程
  • andriod 控件
  • cmd命令如何进入d盘
  • python 安装setup
  • shell批量处理文件
  • 批处理禁用计算机
  • python erf
  • js类的使用
  • js 修改 css
  • jquery中的$是什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设