【从零开始学习JAVA | 第四十五篇】动态代理

目录

前言:

动态代理:

动态代理实现步骤:

动态代理的应用场景:

 总结:


前言:

动态代理作为一种强大的编程技术,不仅为我们提供了灵活性和可扩展性,还为软件开发和系统设计带来了许多优势。通过动态代理,我们能够在运行时创建和修改对象,实现无需修改现有代码的功能增强和拦截操作。

例如我们想为一个类添加新的成员方法,以往我们使用的就是直接往类里面进行添加,我们把这种方法叫做侵入式添加,而这种添加在代码体积大的时候,可能会引起想不到的错误,因此我们引出了动态代理这个概念,而动态代理可以非侵入式的给代码增加额外的功能

动态代理:

动态代理是一种编程技术,它允许在运行时创建代理对象并将方法调用转发给真实的目标对象。动态代理可以用于对对象的方法进行拦截、增强或修改,而无需修改原始对象的代码基于反射机制,在运行时动态地生成代理类,从而实现对目标对象的间接访问。

动态代理常用于解耦和增强系统的功能。通过代理,我们可以在不修改现有代码的情况下,为对象添加额外的行为,如性能监控、日志记录、事务管理等。它还能够简化系统架构,提升代码的可维护性和可测试性。

动态代理在Java中有多种实现方式,如基于Java的Proxy类和基于字节码操作的第三方库,如CGLIB和Byte Buddy。无论哪种方式,动态代理都为开发人员提供了一种灵活且强大的工具,使得面向对象编程更加灵活和可扩展。

动态代理实现步骤:

  1. 定义目标接口:创建一个接口,定义需要代理的方法。

  2. 创建目标类:实现目标接口的具体类,即实际执行操作的类。

  3. 实现 InvocationHandler 接口:创建一个实现 java.lang.reflect.InvocationHandler 接口的代理处理类。这个类将实现方法调用的逻辑。

  4. 使用 Proxy 类创建代理对象:通过 java.lang.reflect.Proxy 的 newProxyInstance() 方法,创建代理对象。该方法接受三个参数:类加载器、目标接口数组和代理处理实现。

  5. 调用代理对象的方法:通过代理对象调用目标接口中的方法,代理处理类中的 invoke() 方法会被触发执行。可以在该方法中添加额外的逻辑来增强目标方法的行为。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 步骤 1: 定义目标接口
public interface Hello {void sayHello();
}// 步骤 2: 创建目标类
class HelloImpl implements Hello {@Overridepublic void sayHello() {System.out.println("Hello, world!");}
}// 步骤 3: 实现 InvocationHandler 接口
class ProxyHandler implements InvocationHandler {private Object target;public ProxyHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method invocation");Object result = method.invoke(target, args);System.out.println("After method invocation");return result;}
}public class Main {public static void main(String[] args) {// 步骤 4: 使用 Proxy 类创建代理对象Hello hello = new HelloImpl();Hello proxy = (Hello) Proxy.newProxyInstance(Hello.class.getClassLoader(),new Class<?>[] { Hello.class },new ProxyHandler(hello));// 步骤 5: 调用代理对象的方法proxy.sayHello();}
}

动态代理的应用场景:

  1. 面向切面编程(AOP):动态代理可以用于在不修改目标类的情况下,为目标类的方法添加额外的逻辑,如日志记录、事务管理、性能监控等。

  2. 延迟加载(Lazy Loading):动态代理可以延迟加载对象的创建,当真正需要使用对象时再创建并执行相应的操作,可以提高系统性能和资源利用率。

  3. 缓存代理:动态代理可以用于在方法调用前检查缓存中是否存在结果,如果存在则直接返回缓存的结果,避免重复执行相同的操作,提高系统的响应速度。

  4. 权限控制:动态代理可以用于在方法调用前进行权限验证,判断用户是否有权限执行该方法,从而实现细粒度的权限控制。

  5. 远程代理:动态代理可以用于在网络通信中,通过代理对象将方法调用传递给远程的服务对象,实现远程方法调用(RPC)。

  6. 事件监听和消息分发:动态代理可以用于实现事件监听和消息分发机制,在触发某个事件或收到消息时,通过代理对象将事件或消息传递给注册的监听器进行处理。

 总结:

动态代理是一种在运行时生成代理对象的技术,它可以在不修改原有代码的情况下,对目标对象的方法进行增强或拦截。实现动态代理的步骤包括定义目标接口、创建目标类、实现 InvocationHandler 接口以及使用 Proxy 类创建代理对象。通过动态代理,我们可以在目标方法的前后添加额外逻辑,如日志记录、性能监测等。动态代理具有较高的灵活性和可扩展性,在实际开发中被广泛应用于日志框架、事务管理等场景。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

布隆过滤器在缓存系统中的实践

一. 背景 在业务开发中&#xff0c;在并发量很高的情况下&#xff0c;通常会使用缓存对系统查询性能进行优化&#xff0c;在缓存命中率很高的情况下&#xff0c;缓存的使用能够大幅提升系统查询性能。但是在缓存命中率非常低场景下&#xff0c;如果采用传统缓存读取模式&#…

Redisson_布隆过滤器

应用场景 去重 诞生背景 Java应用一般通过JDK自身提供的HashSet去重&#xff0c;通过contains()方法判断当前元素是否存在于Set中。该方式要求在调用contains()前&#xff0c;已经将数据列表加载到内存中&#xff08;即该方法基于内存存储实现判断功能&#xff09;。 缺点: 1.满…

【布隆过滤器】

我是&#x1f31f;廖志伟&#x1f31f;&#xff0c;一名&#x1f315;Java开发工程师&#x1f315;、&#x1f4dd;Java领域优质创作者&#x1f4dd;、&#x1f389;CSDN博客专家&#x1f389;、&#x1f339;幕后大佬社区创始人&#x1f339;。拥有多年一线研发经验&#xff0…

xmind用例数据上传至禅道

xmind格式参考&#xff0c;只需要在一级子主题填写对应用例模块ID&#xff0c;其余格式随意即可生成用例并直接上传到禅道&#xff1a; 代码里需填写禅道对应登录账号及用例所属产品 import requests import json import re import hashlib import pprint import threading fr…

认识相机

认识相机 在Threejs中相机的表示是THREE.Camera&#xff0c;它是相机的抽象基类&#xff0c;其子类有两种相机&#xff0c;分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera。类图如下所示&#xff1a; 透视投影相机&#xff08;PerspectiveCam…

【项目实践】海康威视工业相机SDK开发小白版入门教程(VS2015+OpenCV4.5.1)

本文目录 前言怎么查找资料&#xff1f;数据手册例程 项目开发VS版本与OpenCV版本选择VS配置OpenCVVS添加MVS安装目录下的头文件和库VS项目开发 编程问题记录相机数据如何转换为OpenCV的Mat类型&#xff1f;函数不能修改全局指针变量&#xff1f;OpenCV运行报错“有未经处理的异…

Azure Kinect sdk 入门,简单使用深度相机

首先要安装azure Kinect dk传感器和人体跟踪的软件 先安装传感器&#xff1a;Azure-Kinect-Sensor-SDK/usage.md at develop microsoft/Azure-Kinect-Sensor-SDK GitHub 在这个网址里下载&#xff0c; 点击红笔画出来的地方&#xff0c;下载安装&#xff0c;记住安装路径&a…

入门级数码相机

为了满足不同层次顾客的购买要求&#xff0c;小编今天给大家交上一篇家用DC完全导购。从200万像素到800万像中间&#xff0c;分别选取了几款各级别中值得推荐的DC为大家推荐。在这里先给朋友们提一下目前数码相机市场相素与价位之间的简单联系。 目前&#xff0c;200万像素的数…

【计算机视觉-从入门到精通系列】 第二章 相机模型

2.1 针孔模型 计算机视觉是一门研究如何让计算机“看”世界的学科。人要看到世界需要眼睛&#xff0c;计算机要看到世界同样也需要“眼睛”&#xff0c;计算机的“眼睛”主要就是相机。实际应用中&#xff0c;相机的种类纷繁复杂&#xff0c;包括手机和平板电脑的相机&#xff…

5分钟入门Cinemachine智能相机系统

摘要&#xff1a;相机是Unity世界的眼睛&#xff0c;一个智能相机更是能帮咱们节省大把的时间和精力。Cinemachine现在已经大量应用到各种项目中&#xff0c;如果你还没有用过Cinemachine&#xff0c;墙裂建议你来体验一下。 你好&#xff0c;我是跟着大智学Unity的萌新&#x…

立体视觉入门指南(1):坐标系与相机参数

亲爱的同学们&#xff0c;我们的世界是3D世界&#xff0c;我们的双眼能够观测三维信息&#xff0c;帮助我们感知距离&#xff0c;导航避障&#xff0c;从而翱翔于天地之间。而当今世界是智能化的世界&#xff0c;我们的科学家们探索各种机器智能技术&#xff0c;让机器能够拥有…

camera学习入门指南

等待补充。 1.背景介绍 近年来&#xff0c;随着消费电子领域市场的快速增长&#xff0c;如安防、图像等领域&#xff0c;camera市场得到了快速发展。智能手机这几年以拍照作为主打卖点&#xff0c;带动了camera&#xff08;CCM&#xff09;出货。 具体可以看电子行业分析或者券…

机器视觉——入门基础(三)——相机镜头选型

目录 相机选型 分辨率、快门、帧率、色彩、靶面、接口 镜头选型 分辨率、靶面、焦距、接口、光圈畸变工作距离 常用计算示例 相机选型 分辨率、快门、帧率、色彩、靶面、接口 镜头选型 分辨率、靶面、焦距、接口、光圈畸变工作距离 常用计算示例 1. 面阵相机和镜头选型 已…

划重点!| 必须了解的工业相机入门级知识

工业相机是机器视觉系统的核心部件&#xff0c;其相关基础知识是行业内人员必须熟知的。那么分辨率、像素深度、行频、信噪比具体是指什么&#xff1f;CCD和CMOS又该如何去进行选择&#xff1f;今天我们就对这些内容进行一个简单的梳理&#xff0c;希望能够帮助大家了解更多。 …

机器视觉——入门基础(一)—— 相机篇

目录 一&#xff0c;相机就是CCD么&#xff1f; 二&#xff0c;像素。 三&#xff0c;像素直径。 四&#xff0c;CCD的大小。 五&#xff0c;快门速度。 六&#xff0c;增益。 七&#xff0c;1D相机&#xff08;线扫描相机&#xff09; 八&#xff0c;3D相机。 九&…

IP 协议的相关特性和数据链路层相关知识总结

目录 IP 协议的相关特性 一、IP协议的特性 二、 IP协议数据报格式 三、 IP协议的主要功能 1. 地址管理 动态分配 IP地址 NAT机制 NAT背景下的通信 IPV6 2. 路由控制​​​​​​​ 3.IP报文的分片与重组 数据链路层相关知识 1、以太网协议&#xff08;Ethernet&#xff09; 2.M…

掌握Python的X篇_28_python包管理工具pip命令

本篇将会介绍在实际使用python中最能节省效率的内容&#xff0c;利用第三方库拿来就用。 文章目录 1. pip命令是什么2. pip相关操作2.1 list2.2 install2.3 uninstall2.4 导出和导入2.4.1 freeze命令2.4.2 “-r” 3. 国内镜像4. Python Packges Index网站 1. pip命令是什么 p…

DiskGenius分区移动硬盘

打开DiskGenius 右键点击1T&#xff08;实际显示是900多G&#xff09;的移动硬盘&#xff0c;选择快速分区 分区个数按自己需要来选&#xff0c;卷标也按自己需要来修改&#xff0c;取消主分区的勾选框&#xff0c;因为是移动硬盘&#xff0c;不需要转操作系统&#xff0c;所以…

AUtoCAD Civil 3D-曲面-原始数据处理

Civil3D中&#xff0c;曲面是最重要的一个对象之一。曲面涉及到的知识点比较多&#xff0c;作为一个刚接触Civil3D的学习者&#xff0c;可能对于各种概念和各种概念之间的关系比较迷惑。这篇文章及梳理下曲面的一些重要的概念框架。 1、 曲面的分类 曲面可以分为四种类型&…

如何将卫星影像或者航拍影像叠加到CAD设计图上(Auto CAD版)

同步视频教程&#xff1a;卫星图像应用到AutoCAD工程设计&#xff08;套合、叠加、配准&#xff09;-Bigemap GIS Office 视频教程&#xff1a;如何选择中央子午线或者分度带 第一步 工具准备 BIGEMAP地图下载器&#xff1a;Bigemap系列产品-GIS行业基础软件kml\shp 相关教…