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

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

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

  • 荣耀70pro+在哪里设置时间(荣耀7vpro)

    荣耀70pro+在哪里设置时间(荣耀7vpro)

  • 怎么制作表格excel新手(怎么制作表格)(怎么制作表格excel初学者)

    怎么制作表格excel新手(怎么制作表格)(怎么制作表格excel初学者)

  • oppofindx2pro是什么处理器呢(oppofindx2pro是什么调光)

    oppofindx2pro是什么处理器呢(oppofindx2pro是什么调光)

  • 微机的关机顺序是什么(微机关机顺序是什么)

    微机的关机顺序是什么(微机关机顺序是什么)

  • 小米8人脸识别失灵(小米8人脸识别模块坏了)

    小米8人脸识别失灵(小米8人脸识别模块坏了)

  • 荣耀x10刷新率(荣耀x10刷新率多少)

    荣耀x10刷新率(荣耀x10刷新率多少)

  • 网易云音乐黑胶vip有什么用(网易云音乐黑胶是什么意思)

    网易云音乐黑胶vip有什么用(网易云音乐黑胶是什么意思)

  • 计算机网络的三大主要功能是什么(计算机网络的三个基本要素中不包括)

    计算机网络的三大主要功能是什么(计算机网络的三个基本要素中不包括)

  • qq被冻结了邮箱还能上去吗(qq被冻结了邮箱怎么使用)

    qq被冻结了邮箱还能上去吗(qq被冻结了邮箱怎么使用)

  • 荣耀watch2和华为gt2区别(荣耀watch2和华为gt2pro有什么区别)

    荣耀watch2和华为gt2区别(荣耀watch2和华为gt2pro有什么区别)

  • 集线器工作在osi哪一层(集线器工作在osi七层中的哪一层)

    集线器工作在osi哪一层(集线器工作在osi七层中的哪一层)

  • ipad的wlan和wifi的区别(wlan和wifi的区别)

    ipad的wlan和wifi的区别(wlan和wifi的区别)

  • ipad pro能当电脑用吗(ipadpro2021可以当电脑用吗)

    ipad pro能当电脑用吗(ipadpro2021可以当电脑用吗)

  • 小米手环可以插卡吗(小米手环可以插电话卡吗)

    小米手环可以插卡吗(小米手环可以插电话卡吗)

  • iqoo怎么开启性能模式(iqoo手机性能模式怎么开)

    iqoo怎么开启性能模式(iqoo手机性能模式怎么开)

  • 芒果tv如何解绑手机号(芒果TV如何解绑会员)

    芒果tv如何解绑手机号(芒果TV如何解绑会员)

  • pr如何给视频添加音频(pr如何给视频添加背景)

    pr如何给视频添加音频(pr如何给视频添加背景)

  • 抖音如何关闭下载功能?(抖音如何关闭下载视频水印)

    抖音如何关闭下载功能?(抖音如何关闭下载视频水印)

  • 为什么看不到朋友的微信运动(为什么看不到朋友的微信运动步数)

    为什么看不到朋友的微信运动(为什么看不到朋友的微信运动步数)

  • etc激活后可以拔卡吗(etc激活后拔卡,再怎么开启)

    etc激活后可以拔卡吗(etc激活后拔卡,再怎么开启)

  • 华为mate50pro配置参数表(华为Mate50Pro配置多少)

    华为mate50pro配置参数表(华为Mate50Pro配置多少)

  • 腾讯电脑管家怎么清除痕迹?(腾讯电脑管家怎么修复dll)

    腾讯电脑管家怎么清除痕迹?(腾讯电脑管家怎么修复dll)

  • jQuery 获取与设置 元素属性【一篇文章轻松拿下】(jquery获取值的几种方法)

    jQuery 获取与设置 元素属性【一篇文章轻松拿下】(jquery获取值的几种方法)

  • 非独立核算的分公司可以开票吗
  • 购买财务软件可以抵税吗
  • 房屋租赁备案要准备什么资料
  • 施工安全协议违约怎么办
  • 折扣销售的增值税处理方式
  • 信用证保证金是什么意思
  • 商品溢余做销售的会计分录怎么写?
  • 企业自建厂房转让如何计算增值税
  • 企业员工无偿使用合法吗
  • 股权转让资本公积怎么处理
  • 新成立的公司怎么交公积金
  • 金融保险服务业
  • 小企业会计准则主要按照什么计量
  • 向职工出售住房
  • 库存商品的核算方法
  • 上月留抵进项抵扣分录
  • 赡养老人个税扣除标准和条件是什么
  • 提升一下网速
  • 重复确认收入是什么意思
  • 成本费用包括什么项目
  • php使用pdo连接数据库
  • win10插usb没有反应
  • bios setup uitlity
  • 携税宝的作用
  • 结转本月发生的费用
  • 蝴蝶兰的养殖方法和注意事项 盆栽蝴蝶兰烂根
  • 修改配置文件是什么意思
  • PHP:proc_close()的用法_命令行函数
  • php foo
  • 动态定位
  • 雪山上的老鼠
  • 微信红包如何发出去
  • c语言设计酒店管理系统
  • point network
  • 登录界面html5
  • 收付实现制与权责发生制的例题
  • dedecms进入数据库
  • 去年未分配利润为负什么意思
  • VUE3.0+Antdv+Asp.net WebApi开发学生信息管理系统(二)
  • 认缴制和实缴制的时间
  • 公司从个人手中购买二手车
  • sqlserver2012无法新建表
  • 小规模纳税人免税政策2022
  • 小规模纳税人购进税控收款机
  • 增值税不超过30万,普通发票可以开0税率吗
  • 事业单位的服务期
  • 财务专用章的效力
  • sql server如何修改表名
  • 删除 ubuntu
  • vs显示进程已退出
  • 如何用pe弄双系统引导
  • 使用组策略可控制什么
  • 进程lsass.exe
  • win8 桌面图标
  • win10系统如何屏蔽弹窗广告
  • 32/64位Win10预览版11102(中英日韩等)多国语言包官方iso镜像下载大全
  • dos到windows
  • python模拟reversed功能
  • c#在unity的作用
  • unity3d特效教程
  • opengl示例
  • 微信小程序实现查询功能
  • jquery插件怎么用到自己的网站
  • 如何修改apache端口号
  • 深入浅出javascript
  • 使用一串代码
  • nodejs socket hang up
  • js 根据时间排序
  • cmd.parameters.addrange
  • 一个简单的合并单元
  • nodejs示例
  • jQuery使用zTree插件实现树形菜单和异步加载
  • 关于学习的名言
  • js 上传
  • 税收和社保不在同一地缴纳怎么办
  • 西安大修基金和契税怎么计算
  • 2020年砂石
  • 消费税征税环节
  • 财税〔2009〕61号
  • 企业2017年
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设