(JAVA)-动态代理

代理在我们生活中很常见:

:当我们想看演唱会时,让黄牛帮我们排队买。

:当明星要唱歌时,委托别人帮忙准备。

:老婆想吃饭,让老公帮他做饭。

代理模式就是把我们不愿意做的事情委托给别的对象做。

静态代理:我们以吃饭为例子写个demo说明

假设老婆该干的事情有:1.做饭2.吃饭

老婆将做饭工作交给老公(代理)来做

1.首先得定义一个接口,把要代理的方法放进去,老公和老婆都实现了这个接口

public interface things {//把想要代理的方法放进来
void eat();
}

2.接着我们来定义老婆的类:老婆会吃饭。


public class wife implements things public wife() {}private String name;public wife(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void eat(){System.out.println(this.name+"正在吃饭");}
}

3.定义老公的类老公帮老婆做饭

package staticProxy;public class husband implements things {private String name;private wife w;public husband(String name, wife w) {this.name = name;this.w = w;}public husband(wife w) {this.w=w;}@Overridepublic void eat() {this.cook();w.eat();}public void cook(){System.out.println(this.name+"把饭做好了");}
}

最后来调用main方法创建老公老婆对象。

public class test {public static void main(String[] args) {wife w1=new wife("xuxu");husband h1=new husband("dengdeng",w1);h1.eat();}
}

我们可以看到老婆把做饭的任务交给了老公执行。

动态代理:当我们的狗狗也想吃饭了怎么办呢?我们可以通过动态代理的方式解决

我们可以通过Proxy这个类中的静态方法newProxyInstance来获取一个动态代理。

    public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

 newProxyInstance方法的返回值是创建的代理对象。newProxyInstance方法有三个形参:

第一个形参代表着加载类的加载器,通过获取到加载器让他把代理加载到内存中。常常是一个固定格式。

第二个形参是要代理方法的字节码的字节码数组。

第三个形参是一个接口,里面的invoke方法是代理的方法的实现。代理使用方法后会自动调用。

invoke方法参数一:代理的对象,参数二,代理的方法,参数三,调用sing方法传递的实参,返回值:方法运行返回值

package staticProxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyUtil {//给wife创建一个做饭的代理public static things createProxy(Object w){things t= (things)Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),//加载类的加载器,让他把当前的代理加载到内存当中new Class[]{things.class},//实现接口的字节码new InvocationHandler() {//代理方法实现@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//参数一:代理的对象,参数二,代理的方法,参数三,调用sing方法传递的实参,返回值:方法运行返回值System.out.println("代理把饭做好了");return method.invoke(w,args);}});return t;}
}

注意:将传入对象设置成object类型这样就能接收任意类型的对象

  things t1 = ProxyUtil.createProxy(w1);t1.eat();dog d1=new dog("欢欢");things t2 = ProxyUtil.createProxy(d1);
t2.eat();

由结果可知,代理不仅帮了诩诩做饭,还帮了狗做饭。

注意:我们并不是所有的方法都需要这个代理去做饭。我们知道只有诩诩和狗去看吃饭时,才需要代理,如果要实现我们想要的方法上面添加特定的代理,可以通过 invoke 方法里面的方法反射获取 method 对象方法名称即可实现。

在吃饭语句前加上判断。

                 if("eat".equals(method.getName()))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React组件间的通信

在React中&#xff0c;组件间的通信可以通过以下几种方式实现&#xff1a; 父子组件通信&#xff1a; 父组件通过props向子组件传递数据或回调函数。子组件通过props接收数据或回调函数&#xff0c;并在需要时调用回调函数向父组件传递数据。// 父组件 function ParentComponen…

T527 camera: AHD摄像头转MIPI

一、AHD 常见的摄像头接口一般有MIPI、USB、DVP等等&#xff0c;但是MIPI摄像头受限于高速信号的传输距离问题&#xff0c;导致走线不能太长&#xff0c;这样在安防监控领域、车载等领域&#xff0c;使用就很受限&#xff0c;因此会引入AHD&#xff0c;目的就是提高了传…

【unity小技巧】Unity音乐和音效管理器

最终效果 前言 在游戏开发中&#xff0c;音乐和音效的管理是一个重要的环节。好的音乐和合适的音效可以为游戏增添氛围并提升玩家的体验。为了更好地管理音乐和音效&#xff0c;我们可以使用一个专门的音乐和音效管理器。 在本文中&#xff0c;我将向大家介绍如何在Unity中创…

倍思科技红海突围要义:紧随新趋势,“实用而美”理念从一而终

移动数码周边市场始终不缺热度。 销售端是业绩的节节高升&#xff0c;如在2023年京东双十一&#xff0c;移动数码周边产品销售成果丰硕&#xff0c;根据京东战报&#xff0c;大功率充电器成交额同比提升 200%&#xff0c;65W以上移动电源成交额同比提升 150%&#xff0c;自带线…

Spring Boot 生产就绪中文文档-上

本文为官方文档直译版本。原文链接 由于篇幅较长&#xff0c;遂分两篇 Spring Boot 生产就绪中文文档-上 引言启用 Production-ready 功能端点&#xff08;Endpoints&#xff09;启用端点暴露端点安全跨域请求伪造保护 配置端点敏感值脱敏执行器网络终端的超媒体CORS 支持实现自…

视频号小店电脑版怎么登录注册?一篇详解!

大家好&#xff0c;我是电商糖果 糖果今天给大家带来的是视频号小店电脑版的注册流程修改&#xff0c;近期有准备开店的朋友。 一定要认真阅读&#xff0c;内容非常详细。 首先开店前的准备工作&#xff1a;一张企业执照&#xff0c;一个对公账户&#xff0c;一个品牌授权&a…

Java IO流介绍以及缓冲为何能提升性能

概念&#xff1a; 流是一种抽象概念&#xff0c;它代表了数据的无结构化传递。按照流的方式进行输入输出&#xff0c;数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作&#xff0c;而向流中添加数据的操作称为插入操作。 Java IO 也称为IO流&#xff0c;…

海外 proxy代理Croxyproxy使用教程

什麼是Croxy代理&#xff1f; CroxyProxy是一項線上代理服務。它允許用戶訪問被阻止的網站和應用程式&#xff0c;提供一種安全的方式來訪問互聯網資源&#xff0c;同時維護用戶隱私。與許多其他網路代理不同&#xff0c;它支持幾乎所有類型的網站&#xff0c;包括視頻、搜索引…

北京1月1日起,禁止上路!“老头乐”,乐不起来了?

北京“老头乐”退场 2021年7月&#xff0c;北京市公安局、北京市交通委员会等五部门联合发布《关于加强违规电动三四轮车管理的通告》&#xff0c;明确提出&#xff0c;对通告发布前购买的违规电动三、四轮车设置过渡期&#xff0c;过渡期截至2023年12月31日。过渡期结束后&am…

芯课堂 | LVGL基础知识(二)

引言 在 LVGL 中&#xff0c;用户界面的基本构建块是对象&#xff0c;也称为小部件(widget)。默认情况下&#xff0c;LVGL在背景上绘制旧对象&#xff0c;在前景上绘制新对象。 对象层级(Layers) 创建对象层级顺序 默认情况下&#xff0c;LVGL在背景上绘制旧对象&#xff0c…

优化独立站网页布局,提升30%用户留存

近几年很多老板都意识到私域流量的重要性&#xff0c;也都开始从各类平台转战独立站。但是独立站起步也是困难重重&#xff0c;首先很直接的问题就是独立站的搭建&#xff0c;今天咱们就抛开技术&#xff0c;单纯聊聊网页的排版布局。 1. 忌文字多 不是说不让用文字&#xff…

2023:毕业后工作多年机械转编程——心路历程

还记得当初自己为什么选择计算机&#xff1f; 刚接触计算机的时候&#xff0c;是因为工作接触到了一款国家基本服务的软件&#xff0c;跟几个程序员大神们相处了半年&#xff0c;加班到凌晨也不觉得累。我当时是做的工作对标现在的产品经理&#xff0c;但我当时在公司的岗位仅…

vue前端表单常用的邮箱、电话、身份证、url、Ip等正则式多语言版校验

utils工具类中创建verify.js 常用表單校驗 //正则校验的正则表达式&#xff0c;这里注意正则表达式中的‘\’要使用‘\\’转义 const patterns {"name": "^[a-zA-Z_][0-9a-zA-Z_]{0,}$","phone": "^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7…

数字人对话系统 Linly-Talker(已加入Qwen和GeminiPro加强对话+上传任意图片的数字人)

&#x1f525;&#x1f525;&#x1f525;数字人对话系统 Linly-Talker&#x1f525;&#x1f525;&#x1f525;&#xff08;已加入Qwen和GeminiPro加强对话上传任意图片的数字人&#xff09; English 简体中文 欢迎大家star我的仓库 https://github.com/Kedreamix/Linly-Ta…

Git专栏篇

一、基础知识 二、常用手段 1. 复制其他提交到本分支 目的&#xff1a;现有git仓库&#xff0c;该仓库有两个分支a和b&#xff0c;将a分支的最近三个版本提交内容复制 到b分支的提交上。 在 Linux 系统中&#xff0c;你可以按照以下步骤将分支 A 的最近三个版本的提交内容复…

linux 环境下安装ffmpeg。

参考 https://www.anquanclub.cn/9782.html 下载解压 wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz tar -zxvf ffmpeg-3.1.tar.gz cd ffmpeg-3.1. ./configure --prefix/usr/local/ffmpeg make && make install 之后在 ffmepg目录下执行 ./ffmpeg -versio…

CMake中引入第三方库

CMake中&#xff0c;如果我们需要引入第三方库&#xff0c;首先想到的是用find_package函数。的确&#xff0c;如果我们引入的第三方库是一些比较标准的库如OpenCV可以用下面的代码。 set(OpenCV_DIR xxxx) # xxxx目录包含OpenCVConfig.cmake find_package(opencv required) #…

XOR运算文件加密示例

前言&#xff1a; XOR加密是一种非常简单的加密技术属于对称加密&#xff08;相同的密钥进行加密和解密&#xff09;&#xff0c;不提供机密性或完整性验证因此不适用于高度敏感的数据&#xff0c;容易受到各种攻击&#xff0c;包括已知明文攻击。在实际应用中&#xff0c;应该…

实时记录和查看Apache 日志

Apache 是一个开源的、广泛使用的、跨平台的 Web 服务器&#xff0c;保护 Apache Web 服务器平台在很大程度上取决于监控其上发生的活动和事件&#xff0c;监视 Apache Web 服务器的最佳方法之一是收集和分析其访问日志文件。 Apache 访问日志提供了有关用户如何与您的网站交互…

外贸客户邮箱采集软件的工作原理

外贸客户邮箱采集软件是专为外贸从业人员设计的工具&#xff0c;旨在帮助用户快速、准确地获取潜在客户的邮箱地址。此类软件在国际贸易中发挥着越来越重要的作用&#xff0c;尤其在当前数字化时代&#xff0c;有效的客户邮箱采集已成为外贸业务成功的关键因素之一。 该软件的…