动态代理代码示例

理解动态代理

  1. 动态代理的核心在于代理对象的创建和方法调用是在运行时动态发生的,而不是在编译时就已经确定的
  2. 性能监控、事务管理、日志记录通常需要使用代理对象对目标对象的功能进行增强
  3. 为什么JDK动态代理只能代理有接口的类?
  • 因为Proxy.newProxyInstance方法需要传入被动态代理的接口类target.getClass().getInterfaces(),之所以要传入接口而不能传入类,因为JDK动态代理会在运行时生成一个代理类,叫做$Proxy0,这个代理类会继承java.lang.reflect.Proxy这个类,同时还会去实现被代理类的接口,在Java里面是不支持多继承的,而每一个动态代理类都继承了一个Proxy,所以就导致了JDK动态代理只能代理接口,而不能代理实现类
  • 其实也可以进行实现类的代理,但是代理接口的设计更符合业务场景,因为实际的开发中都是面向接口来开发的,所以基于接口来实现动态代理更符合业务场景

JDK动态代理

public interface Service {void doSomething();
}public class ServiceImpl implements Service {@Overridepublic void doSomething() {System.out.println("Doing something");}
}import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** JDK动态代理示例*/
public class MyInvocationHandler implements InvocationHandler {// target在构造之后不会发生改变private final Object target;public MyInvocationHandler(Object target) {this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("前置处理");Object object = method.invoke(target, args);System.out.println("后置处理");return object;}// 调用此方法,会返回一个实现了目标对象所有接口的代理对象,这个代理对象会使用当前类作为InvocationHandlerpublic Object getProxy() {// 类加载器、接口数组、InvocationHandlerreturn Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this);}}public static void main(String[] args) {// 创建真实的服务对象Service realService = new ServiceImpl();// 创建 MyInvocationHandler 的实例,并传入真实的服务对象MyInvocationHandler handler = new MyInvocationHandler(realService);// 使用 MyInvocationHandler 创建代理对象Service proxy = (Service) handler.getProxy();// 调用代理对象的方法proxy.doSomething();}

CGlib动态代理

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.2.5</version></dependency>

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;/*** 适用于没有实现任何接口的类* 需要引入cglib代码库* cglib增强器,负责拦截方法调用,并添加额外逻辑*/
public class CGlibProxy implements MethodInterceptor {public Object createProxy(Object target) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(target.getClass());enhancer.setCallback(this);return enhancer.create(); // 动态创建代理对象}@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("前置处理");Object result = proxy.invokeSuper(obj, args); // 动态调用方法System.out.println("后置处理");return result;}
}public static void main(String[] args) {ServiceImpl service = new ServiceImpl();CGlibProxy proxy = new CGlibProxy();ServiceImpl proxyService = (ServiceImpl) proxy.createProxy(service);proxyService.doSomething();}

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

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

相关文章

需求7———通过一个简单的小需求来理清修改后端的思路

我今天下午刚刚完成了睿哥早上说的几个小问题&#xff0c;现在距离下班时间还有两个小时&#xff0c;已经没啥可干的了&#xff0c;然后我发现我之前做的很多需求还没有写文章来总结&#xff0c;所以现在趁着有空&#xff0c;我先写一下总结。这么多需求中&#xff0c;我挑了一…

【leetcode】238.除自身以外数组的乘积

由于该题不能使用除法&#xff0c;所以参考题解写一个左右乘积列表的方法 创建两个新的数组pef,suf 一个用于记录从左到右的乘积&#xff08;类似于动态规划的思想&#xff09;pef 另一个记录从右到左的乘积 bsuf&#xff08;注意suf是从右到左进行累乘&#xff09; 而pef的最左…

【3dgs】3DGS**(3D Geometry Sensing)与 **NeRF**(Neural Radiance Fields)对比

以下是 3DGS&#xff08;3D Geometry Sensing&#xff09;与 NeRF&#xff08;Neural Radiance Fields&#xff09;对比表格&#xff1a; 更加详细的资料&#xff0c;轻参考&#xff1a; NERF/3DGS 对比维度3DGS (3D Geometry Sensing)NeRF (Neural Radiance Fields)基本原理…

Linux之shell详解(Linux Shell Detailed Explanation)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现

通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高&#xff0c;资源占用少&#xff0c;对于翻译要求不高的应用场景可以使用&#xff0c;比如单词&#xff0c;简单句式的中英文翻译。 该示例使用的模型下载地址&#xff1a;【免费】Helsinki-NLP中英文翻译本…

浙江大学机试试题合集(2)

🍰🍰🍰hello宝子们,今天我们继续来练习浙江大学的机试题目。加油!fighting!( •̀ ω •́ )✧ 21🍩1696 Ambulance Dispatch 给定一张城市地图,上面有所有的救护车调度中心(救护车派遣中心) 并标记所有拾取点。你应该写一个程序来处理紧急呼叫。假设来电者正在某个…

得物App荣获“科技创新服务示范案例”,推动品质消费新升级

备受瞩目的2024年中国国际服务贸易交易会在北京盛大开幕&#xff0c;这一由商务部和北京市政府联合举办、并获得世贸组织、联合国等国际组织支持的国家级、国际性、综合型服务贸易盛会&#xff0c;再次吸引了全球的目光。作为上海科技企业的优秀代表&#xff0c;得物App亮相此次…

为什么Linux系统下的程序无法在Windows下运行

两个系统的格式不同&#xff0c;格式就是协议&#xff0c;是在固定位置有意义的数据。Linux下可执行文件格式是elf&#xff0c;可使用readelf查看elf文件头 而Windows下的可执行程序是PE格式&#xff0c;是一种可执行文件。 还有一点是Linux下和Win下系统API不同&#xff0c;这…

Stable Diffusion最新版nowebui的api使用详解

最近在使用stable diffusion最新版的Stable Diffusion WebUI Forge进行api调用,下面来一步一步的进行展开吧!!! 1、下载lllyasviel/stable-diffusion-webui-forge GitHub - lllyasviel/stable-diffusion-webui-forgeContribute to lllyasviel/stable-diffusion-webui-for…

Vxe UI vue vxe-table 实现表格单元格选中功能

Vxe UI vue vxe-table 实现表格单元格选中功能 在表格中实现鼠标点击任意单元格&#xff0c;选取的功能&#xff0c;通过 mouse-config 配置就可以开启单选功能&#xff0c;多选单元格选取功能需安装插件支持。 代码 参数说明 mouse-config 鼠标配置项&#xff1a; selected&…

基于连续小波变换(CWT)批量生成一维信号的时频图 最终生成30张时频图。生成的图像可用于后续的深度学习分类或其他处理。附详细的说明文档。

Matlab基于连续小波变换&#xff08;CWT&#xff09;&#xff0c;将一维信号批量生成时频图的源代码。此示例中&#xff0c;原始信号data是30*1280的格式&#xff0c;一共30条信号&#xff0c;信号长度为1280。最终生成30张时频图。生成的图像可用于后续的深度学习分类或其他处…

多级代理与提权维权

目录 代理构建FRP介绍下载配置⽂件&#xff1a; sock5代理Venom介绍下载配置 icmpsh介绍下载配置 pingtunnel介绍下载配置 EarthWorm介绍下载使用 权限提升win权限提升常⻅利⽤⼯具 Linux权限提升SUID提权 权限维持win权限维持系统服务后⻔⾃启动⽬录注册表后⻔其他类似隐藏⽤户…

前端vue-配置请求拦截器

1.配置拦截器&#xff0c;记得20行的导出 2.响应拦截器&#xff0c;记得28行的导出 3.拦截器不止可以拦截&#xff0c;还可以添加内容

解锁SoC “调试”挑战,开启高效原型验证之路

引言&#xff1a; 由于芯片设计复杂度的提升、集成规模的扩大&#xff0c;以及产品上市时间要求的缩短&#xff0c;使得设计验证变得更加困难。特别是在多FPGA环境中&#xff0c;设计调试和验证的复杂性进一步增加&#xff0c;传统的调试手段难以满足对高性能、高效率的需求。因…

Spring Boot 进阶-详解SpringBoot的复杂数据校验规则

在之前的文章中,我们介绍了SpringBoot整合JSR-303规则来完成数据校验操作。接下来我们来聊一聊关于数据校验的具体用法。 之前的文章中举过一个简单的例子通过学生信息提交的例子来介绍了关于数据校验如何去做。那么接下来这篇文章,我们就来看看对于一些复杂的数据校验如何完…

实例讲解电动汽车VIN写入规则及Simulink建模方法(一)——VIN校验方法及Simulink建模

目录 一、车辆VIN简介 二、电动汽车VIN写入规则及校验和规则 1、写入规则 2、校验和规则 三、VIN校验方法及Simulink建模 1、VIN校验方法 2、上位机发送VIN写入报文解包Simulink建模 3、校验和对比验证Simulink建模 4、VIN校验方法Simulink建模整体模型 四、总结 一、…

10.8 springBoot学习

学习内容的来源途径:spring Boot 1.不同的架构 之前写的qq是C/S,百度贴吧,淘宝之类的网站项目则为B/S架构. 2.两种架构对比

0基础跟德姆(dom)一起学AI 机器学习04-逻辑回归

逻辑回归简介 应用场景 逻辑回归是解决二分类问题的利器 数学知识 sigmoid函数 概率 极大似然估计 核心思想&#xff1a; 设模型中含有待估参数w&#xff0c;可以取很多值。已经知道了样本观测值&#xff0c;从w的一切可能值中&#xff08;选出一个使该观察值出现的概率为…

No.13 笔记 | 网络安全防护指南:从法律法规到技术防御

一、法律法规 《中华人民共和国网络安全法》要点 遵守法律&#xff1a;所有个人和组织在使用网络时&#xff0c;必须遵守宪法和法律&#xff0c;不得利用网络从事危害国家安全等活动。 个人信息保护&#xff1a;禁止非法获取、出售或提供个人信息。若违反但未构成犯罪&#x…

Rust编程的匹配控制语句match

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 学过C语言的同学或许在等switch&#xff0c;明确告诉你们&#xff0c;Rust没有switc…