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

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

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

  • 个人取得上市公司股票期权个人所得税
  • 企业接受捐赠固定资产计入什么科目
  • 财务费用余额方向怎么填
  • 个税申报系统跟工资表累计扣除数不一致怎么办
  • 已经认证的发票对方可以作废吗
  • 一般纳税人增值税怎么做账务处理
  • 以前借款没做账现在收回来怎么做账务处理?
  • 跨月作废发票怎么开
  • 项目结余是什么意思
  • 应交所得税的计算例题
  • 公司代缴员工个税
  • 代理进口一般几个点费用
  • 个人装卸费如何开票
  • 汽车折旧年限与什么有关
  • 营改增后小规模ktv怎么纳税
  • 税审计入什么科目?
  • 董事费监事费高管薪酬标准
  • 劳务派遣一般纳税人可以简易征收吗
  • 公司买回来做样衣的服装怎么做会计分录?
  • 代付租金委托书怎么写
  • 平销返利税率
  • 个税退手续费要多久到账
  • i5 8500装win10
  • 融资租赁和经营租赁哪个更常见
  • mac catalina系统怎么样
  • linuxssh免密登录
  • 应收账款 预收账款合并
  • 银行对公账户收款码手续费多少
  • 销售货款未收回应该从工资中扣除吗
  • 企业购入固定资产一次性税前扣除
  • windows7旗舰版最新版本
  • 红字发票如何开具
  • 圣托里尼岛具体位置
  • ci框架教程
  • php操作mysql数据库
  • html小游戏代码大全
  • 如何让header居中
  • ubuntu端口不能远程访问
  • ps怎么旋转某个图形快捷键
  • 怎么保证发票是真的
  • 职工福利费怎么处理
  • 主营业务收入的t型账户怎么写
  • 手机上动态调试apk
  • 汽车折旧年限是几年如何计算
  • 小规模纳税人是个体户吗
  • 对方开给我的专票,我要报税吗?
  • 日记总账的适用范围
  • 资本公积和盈余公积是什么意思
  • 应收账款属于会计分录
  • 盈余公积分配现金股利分录
  • 职工社会保险费是什么意思
  • 股东撤资后需要承担责任
  • 支付大型设备税率是多少
  • 收到货款确认收入还是开好发票确认收入
  • 其他业务收入的附加税的会计分录
  • 新建厂房需要缴纳什么税
  • 购入自用的机器怎么入账
  • 怎么用两台电脑登录同一个微信
  • 存货成本计算方法有几种?分别是什么?
  • 外贸整个流程图
  • sql注入讲解
  • Ubuntu下MySQL中文乱码的问题解决
  • WIN7系统屏幕亮度哪里设置
  • 进程死锁原因
  • 苹果Mac系统怎么安装
  • 虚拟光驱安装
  • exfat 打不开
  • centos 常用命令教程
  • win8电脑设置打不开怎么办
  • win8引导文件
  • 使用灭火器人要站在上风口还是下风口
  • unity着色器在哪
  • linux升级python2.7
  • 区分例假和怀孕前乳头疼
  • android binary xml
  • Unity3D的MonoBehaviour可重写函数
  • android基础知识大全
  • python中的编码
  • javascript基本语句
  • 新道云软件介绍
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设