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

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

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

  • 扫码开票开错了怎么改
  • 国际货运代理可以开免税吗
  • 出租包装物租金是营业外收入吗
  • 小规模纳税人开专票需要交税吗
  • 外地施工如何找工人
  • 税务局代开的进项票需要认证吗
  • 文化事业建设费税收优惠政策2023
  • 正常经营损失
  • 其他收益科目账务处理
  • 其他应收款是否要收利息
  • 关税如何征收
  • 进货没有开具发票能退吗
  • 股东货币出资比例
  • 一次性离职补偿个税
  • 2018增值税暂行条例
  • 自产自销农产品企业所得税
  • 减免税款余额方法有哪些
  • 建筑业增值税税率由11调整到10
  • 年终一次性奖金个税计算
  • 广告费和业务宣传费15%还是30%
  • 车船税为什么没有优惠
  • 资产负债表中其他流动资产怎么计算
  • 现金折扣列题
  • 费用确认条件新准则
  • 安卓系统详解
  • win10 21h1激活密钥
  • Win11 Build 22454.1000 开发者预览版发布(附更新修改已知问题+安装)
  • 发票开出后只收到部分款怎么处理?
  • 由于找不到msvcr120.dll,无法继续执行代码什么意思
  • 旧设备投资的税务处理
  • 最轻薄数码相机
  • yifile怎么使用
  • PHP:imagetruecolortopalette()的用法_GD库图像处理函数
  • 房屋装修固定家具是否计入房产税
  • chat function
  • php提示框
  • 其他流动资产是速动资产吗
  • three.js gui
  • 反斜杠python
  • 工程施工科目下的招待费,汇算清缴
  • vue引用类型
  • 微软和梅赛德斯奔驰宣布合作
  • 专项应付款怎么转固定资产
  • 电脑学word下哪个软件视频
  • 未开票金额怎么填写
  • 外贸企业申报出口退税资料
  • 供应商的质量扣款应该开什么发票
  • mongodb 入门
  • 工会费的会计分录是什么
  • 终止劳动合同赔偿金最晚多久发放
  • 报废车残值需要多少钱
  • 高新企业奖励金怎么开票
  • 企业年度所得税怎么算
  • 对方企业倒闭了是否能函证
  • 专利补贴收入计入什么科目
  • 法人购买设备投入企业
  • 计提人工成本会计分录
  • 低值易耗品怎么处理
  • macos装mysql
  • mysql数据库自动重启
  • sql server数据库正在恢复
  • linux中安装软件可使用哪些方式
  • u盘发光
  • window10电话
  • ubuntu搭建tftp服务器
  • mac系统制作
  • linux系统中的用户分为哪几类
  • win7组合键失效
  • 如何去掉windows不是正版
  • linux diff命令详解
  • web标准化
  • opengl绘图
  • incaseformat查杀
  • python中将
  • jquery $each
  • shell 字符串trim
  • Javascript this 关键字 详解
  • javascript程序设计教程
  • 关于成品油的吨油换算
  • 沈阳特慢病待遇
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设