动态代理:一种灵活的设计模式

动态代理是一种在运行时创建和使用代理对象的设计模式,它可以在不修改原始类和接口的情况下,对原始对象进行额外的操作或增强。动态代理广泛应用于各种编程场景,如前后端处理、数据访问、业务逻辑优化等。本文将介绍动态代理的概念、分类、实现、优化和应用。

一、动态代理的概念

动态代理是一种以动态方式创建代理对象的设计模式,它可以在运行时根据需要实现代理对象的创建、调用和销毁。动态代理的主要目的是在不修改原始类和接口的情况下,对原始对象进行额外的操作或增强。它可以帮助开发人员在不修改原有代码的情况下,实现扩展、修改、监控等功能,提高代码的可维护性和可重用性。

二、动态代理的分类

根据实现方式的不同,动态代理可以分为以下几类:

  1. 基于接口的动态代理:通过实现Java的InvocationHandler接口来创建动态代理对象。
  2. 基于契约的动态代理:通过定义一个特定的契约或模板方法,来实现动态代理对象的创建和使用。
  3. 基于反射的动态代理:通过Java的反射机制来创建动态代理对象,可以实现对任意对象的代理。
  4. 基于字节码的动态代理:通过修改字节码来实现动态代理对象,如ASM、CGLIB等库的使用。

三、动态代理的实现

下面以基于接口的动态代理为例,介绍动态代理的实现过程:

  1. 定义一个InvocationHandler接口,实现invoke()方法。
public interface InvocationHandler {Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
  1. 创建一个实现InvocationHandler接口的类,实现invoke()方法。在该方法中,可以实现对原始对象的方法调用和处理。
public class MyInvocationHandler implements InvocationHandler {private Object target;public MyInvocationHandler(Object target) {this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 在调用原始方法前,可以进行额外的操作或增强System.out.println("Before calling method " + method.getName());Object result = method.invoke(target, args);System.out.println("After calling method " + method.getName());// 在调用原始方法后,可以进行额外的操作或增强return result;}
}
  1. 创建一个实现被代理接口的类,并将其作为参数传递给Proxy.newProxyInstance()方法。同时,将InvocationHandler对象作为参数传递给该方法。该方法将返回一个代理对象。
public interface MyInterface {void doSomething();
}
public class MyClass implements MyInterface {public void doSomething() {System.out.println("Doing something...");}
}
public class Main {public static void main(String[] args) {MyInterface myObj = new MyClass();InvocationHandler handler = new MyInvocationHandler(myObj);MyInterface proxyObj = (MyInterface) Proxy.newProxyInstance(MyInterface.class.getClassLoader(), new Class[]{MyInterface.class}, handler);proxyObj.doSomething(); // 调用代理对象的方法,将触发InvocationHandler中的invoke()方法,实现对原始对象的额外操作或增强。输出:Before calling method doSomething() Doing something... After calling method doSomething()。}

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

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

相关文章

【C++】模版进阶

我们在之前的博客中讲述过模版的使用:【C】模版初阶,但这只是模版最基本的使用,下面再深入模版,看看还有另外什么用法: 目录 一、非类型模板参数 二、模板的特化 2.1 什么是模版的特化 2.2 函数模版的特化 2.3 类…

python实现将图片数据以TFRecord方式存储

以TFRecord方式存储的优点 高效性:TFRecord是一种二进制格式,可以提供更高的存储和读取效率。它可以更快地读取和解析数据,特别适用于大规模数据集 可压缩性:TFRecord可以使用压缩算法进行压缩,减小数据文件的大小。这…

电脑怎么共享屏幕?电脑屏幕共享软件分享!

如何控制某人的电脑屏幕? 有时我们可能需要远程控制某人的计算机屏幕,例如,为我们的客户提供远程支持,远程帮助朋友或家人解决计算机问题,或在家中与同事完成团队合作。那么,电脑怎么共享屏幕&#xff…

记录--vue3实现excel文件预览和打印

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在前端开发中,有时候一些业务场景中,我们有需求要去实现excel的预览和打印功能,本文在vue3中如何实现Excel文件的预览和打印。 预览excel 关于实现excel文档在…

java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性

目录 一、使用场景 二、环境准备 1、引入依赖 2、实体类 三、示例 1、不返回空值 (1)方式 (2)测试 (3)说明 2、不返回部分属性 (1)方式 (2)测试 一、使用场景 在开发过程中,有时候需要将后端数据返回前端,此时有些数据为空属性不需要返回&…

华为c语言编程规范

提示:附件为编程规范 文章目录 前言一、华为c语言编程规范总结 前言 例如:华为规范下载 一、华为c语言编程规范 附件为编码规范 总结 提示:附件规范可供下载

海南海口大型钢结构件3D扫描全尺寸三维测量平面度平行度检测-CASAIM中科广电

高精度三维扫描技术已经在大型工件制造领域发挥着重要作用,特别是在质量检测环节,高效、高精度,可以轻松实现全尺寸三维测量。本期,CASAIM要分享的应用是在大型钢结构件的关键部位尺寸及形位公差检测。 钢结构件,是将…

LabVIEW更改图像特定部分的颜色

LabVIEW更改图像特定部分的颜色 在随附的照片中,想将包围的部分更改为黄色。该怎么做?或者如何将图像的蓝色部分更改为绿色。 绘制拼合像素图不接受数组或输出数组。如果需要有关函数的更多信息,请按 CTRL H 打开上下文帮助,或单…

python下拉框选择测试

把下拉选择的值得打印出来: import tkinter as tk def on_select(event): # 当选择下拉框中的一项时,此函数将被调用 selected event.widget.cget("text") # 获取选中的文本 print(f"You selected: {selected}") # 打印选中…

【机器学习可解释性】3.部分依赖图

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP Value5.SHAP Value 高级使用 正文 每个特征怎么样影响预测结果? 部分依赖图 Partial Dependence Plots 虽然特征重要性显示了哪些变量对预测影响最大,但部分依赖图显示了特征如…

OpenHarmony docker环境搭建所见的问题和解决

【摘要】OpenHarmony docker环境搭建需要一台安装Ubuntu的虚拟机,并且虚拟机中需要有VScode。 整个搭建流程请参考这篇博客:OpenHarmony docker环境搭建-云社区-华为云 (huaweicloud.com) 上篇博主是用Ubuntu的服务器进行环境搭建的,在使用VS…

深度学习之基于yolov8的安全帽检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、基于yolov8的安全帽检测系统四. 总结 一项目简介 在企业作业和工地施工过程中,安全永远高于一切。众所周知,工人在进入…

linux上安装apktool反编译apk解析AndroidManifest.xml得到首页Activity

需求 在linux系统上反编译安卓app, 有些应用需要知道其主页Activity用于adb指令打开其主页。 安装 自动安装脚本 #!/bin/bashwget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool -O ./apktool wget https://bitbucket.org/iBotPeac…

NodeJS14.18.0 安装,以及安装相应版本node-sass

安装了NVM, NodeJS 14.18.0 安装nvm 到c:\nvm目录 务必!!!!!!!! nvm文档手册 - nvm是一个nodejs版本管理工具 - nvm中文网 编辑c:\nvm\settings.txt添加 node_mirror: CNPM Binar…

matlab创建矩阵、理解三维矩阵

1.创建矩阵 全0矩阵:a zeros(2,3,4) 全1矩阵:a ones(2,3,4) !和python不一样的地方!此处相当于创建了4页2行3列的矩阵,而在python里是2页3行4列。 对第1页的第2行第3列元素进行修改:

WebDAV之π-Disk派盘 + 言叶

言叶是一个功能丰富的笔记软件,为跨平台而设计,可以为你在手机、电脑和其他设备中实现多端同步。从而实现高效率的记事和办公。支持Markdown的语言和多种计算机语法高亮功能,让你笔记中的内容更加主次分明,可以在这里记录一些代码什么的。同时还可以在笔记中插入图片,使其…

ab压力测试

标题相关概念 QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 互联网中,作为域名系统服务器的机…

JavaScript_对象_Function_定义与参数

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Function对象</title><script>/*** Function&#xff1a;函数&#xff08;方法&#xff09;对象* 1.创建&#xff1a;* 1.…

六零导航页SQL注入漏洞复现(CVE-2023-45951)

0x01 产品简介 LyLme Spage&#xff08;六零导航页&#xff09;是中国六零&#xff08;LyLme&#xff09;开源的一个导航页面。致力于简洁高效无广告的上网导航和搜索入口&#xff0c;支持后台添加链接、自定义搜索引擎&#xff0c;沉淀最具价值链接&#xff0c;全站无商业推广…

如何在忘记手机密码或图案时重置 Android 手机?

忘记手机密码或图案是 Android 用户一生中不得不面对的最令人沮丧的事情之一。恢复 Android 设备的唯一方法是在 Android 设备上恢复出厂设置。但许多用户不使用此方法&#xff0c;因为此过程会擦除您设备上可用的所有个人数据。 但是&#xff0c;有一种方法可以在不丢失任何数…