当前位置: 首页 > news >正文

Java 动态代理简述和实例

Java动态代理是一种在运行时动态创建代理对象的技术。它可以让我们在不修改原始代码的情况下,对原始对象进行增强或者添加额外的行为。这种代理方式可以用于很多场景,例如AOP编程、RPC框架等。动态代理是基于Java反射机制实现的,它允许程序在运行时动态地获取类的信息,并且可以在运行时动态地创建对象、调用方法等。


首先需要准备一个接口和实体类

public class Student {private DoSomeThing doSomeThing;// ...省略 Getter 和 Setter
}
public interface DoSomeThing {default void eat() {System.out.println("吃\n");}default void drink() {System.out.println("喝\n");}default void run() {System.out.println("跑\n");}}

接着就可以来对 Student 实体类中的 DoSomeThing 接口进行动态代理了:

    public static void main(String[] args) throws Exception {Student student = new Student();student.setDoSomeThing(new DoSomeThing() {});hookStudent(student);student.getDoSomeThing().eat();student.getDoSomeThing().drink();student.getDoSomeThing().run();}private static void hookStudent(Student student) throws Exception {Class studentClass = student.getClass();Field field = studentClass.getDeclaredField("doSomeThing");field.setAccessible(true);Object doSomeThingObj = field.get(student); // 接口实体,后面用来保证 代理后能执行原本的方法Object proxy = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),new Class[]{DoSomeThing.class},  // 代理目标类,要求是未实现的接口,否则会报错new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 代理成功后,每调用一次接口函数都会走一遍 invoke()// 且携带方法信息和方法参数,这样子就可以对 指定方法 做判断和处理了System.out.println("调用invoke函数");return method.invoke(doSomeThingObj, args); // 执行原本的方法}});field.set(student, proxy);  // 将实体类中的 接口对象 替换为 代理对象}

首先初始化了 实体类(Student)和接口参数,再对 实体类 中的接口参数进行 动态代理 ,俗称AOP切面编程。代理后每使用一次接口参数中的方法就会调用一次invoke方法, invoke 方法中携带了方法和参数信息,开发者可以对此进行 条件判断和处理。最后,执行接口原来的方法。


执行结果:

相关文章:

Java 动态代理简述和实例

Java动态代理是一种在运行时动态创建代理对象的技术。它可以让我们在不修改原始代码的情况下,对原始对象进行增强或者添加额外的行为。这种代理方式可以用于很多场景,例如AOP编程、RPC框架等。动态代理是基于Java反射机制实现的,它允许程序在…...

Unity编译器扩展(Advanced Editor Scripting)

Untiy编译器扩展允许我们对编译器的增加自己编写的的功能菜单栏MenuItemContextMenu和ContextMenuItemContextMenuContextMenuItemMenuItem 该属性允许您将菜单项添加到主菜单和检查器窗口上下文菜单。 该属性将任何静态函数转换为菜单命令。只有静态函数可以使用该属性。 Men…...

AFR机制及流程介绍

AFR(Auto Fast Return)不符合3GPP协议标准,因此终端默认是disable状态。如果运营商有要求可以配置开启。 AFR有两种场景 2G或者3G AFR到4G4G AFR到5G3G AFR TO 4G AFR到LTE功能的作用就是终端从LTE Handover或者重定向到3G进行业务,等业务做完后能够快速回到LTE网络。...

9.Hbase 部署

9.Hbase部署 注意事项: 1:必须事先安装 Hadoop分布式集群,zookeeper分布式集群 2:查看版本号: hbase version1、解压文件并改名 tar -zxvf /opt/software/hbase-2.2.3-bin.tar.gz -C /usr/app/ mv hbase-2.2.3/ hba…...

【maven 学习记录】

maven 学习记录一、maven基础1. maven是什么2. maven的作用3. maven的下载安装4. maven仓库5. maven坐标6. 第一个maven项目 手工实现7. maven插件8. 依赖管理9. 生命周期二、maven进阶一、maven基础 1. maven是什么 maven的本质是一个项目管理工具,将项目开发和管…...

NB-IOT宣传这么多年,这次总算用好了吧

一、方案概述随着实体经济快速发展,石化、港口、货场、工地等区域规模日益扩大,厂区面积广阔、环境复杂、作业人员和车辆众多,如无法实时掌握工作人员状态及外来人员位置、外来车辆情况等问题,将存在非常大的安全隐患。今天小编介…...

sort函数对结构体|pair对组|vector容器|map排序|二维数组的第x列 的排序

目录 sort对 vector容器 sort对 vector<pair<int,int>>对组 sort对 结构体 结构体外部规定排序 结构体内部运算符重载 map容器的排序 map的键排序 map的值排序 sort对二维数组的排序 sort对 vector容器 sort()函数可以用于对vector容器进行排序。具体来…...

Java定时器Timer的使用

一、Timer常用方法 Timer应用场景&#xff1a; 1、每隔一段时间执行指定的代码逻辑&#xff08;即按周期执行任务&#xff09; 2、指定时间执行指定的代码逻辑 为方便测试并查看运行效果&#xff0c;首先先建一个类并继承TimerTask&#xff0c;代码如下: package timerTest…...

MySQL安装和配置

下载官网下载mysql解压版本&#xff1a;配置环境变量下载完成后直接解压到需要放的文件夹&#xff0c;根据文件夹来配置环境变量&#xff1b;新建系统变量&#xff0c;变量名自取&#xff0c;值是MySQL的目录编辑path环境变量&#xff0c;加上MySQL的bin目录 %MYSQL_HOME%\bin配…...

openpnnp - 载入板子后,要确定板子的放置角度

文章目录openpnnp - 载入板子后,要确定板子的放置角度概述用openpnp提供的功能来确定被夹住的板子的左下角原点位置和板子的角度备注ENDopenpnnp - 载入板子后,要确定板子的放置角度 概述 设备是有夹具的, 用百分表打过, 夹具本身在Z方向的平行度是没问题的. 但是, PCB板子的…...

HCIP知识点(前三天)

复习HCIA&#xff1a; 一、TCP/IP模型&#xff0c;OSI模型 OSI 开放式系统互联参考模型 应用层 抽象语言—>编码 表示层 编码—>二进制 会话层 应用程序内部的区分地址&#xff08;无标准格式&#xff09; 传输层 TCP/UDP – 分段&#xff08;受MTU限制&#xff09;、端…...

模板学堂丨妙用Tab组件制作多屏仪表板并实现自动轮播

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https://dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&#xff0c;并…...

C++:初识函数模板和类模板

目录 一. 泛型编程 二. 函数模板 2.1 什么是函数模板 2.2 函数模板的实例化 2.2.1 函数模板的隐式实例化 2.2.1 函数模板的显示实例化 2.3 函数模板实例化的原理 2.4 模板函数调用实例化原则 三. 类模板 3.1 什么是类模板 3.2 类模板的实例化 一. 泛型编程 泛型编程…...

3.8妇女节如何做好TikTok网红营销?

3月8日是国际妇女节&#xff0c;这一节日已经成为全球关注女性权益和平等的标志性日子&#xff0c;TikTok上话题#internationalwomensday累计播放超10亿次&#xff0c;话题#WomensDay2023累计播放量也将近300万次。 这个特别的日子为品牌提供了一个很好的营销机会。据Nox聚星了…...

使用Advanced Installer打包程序及运行环境

Advanced Installer 工具版本&#xff1a;20.1.1 设置产品信息 选中右侧【Product Details】输入产品信息 设置文件和文件夹 添加使用VS发布之后的程序文件夹 设置文件夹刷新 选中文件夹&#xff0c;右键选择属性&#xff0c;选中Synchronize标签。启用“Synchronize conten…...

华为OD机试真题Python实现【计算堆栈中的剩余数字】真题+解题思路+代码(20222023)

计算堆栈中的剩余数字 题目 向一个空栈中依次存入正整数 假设入栈元素N(1<=N<=2^31-1) 按顺序依次为Nx … N4、N3、N2、N1, 当元素入栈时,如果N1=N2+...Ny(y的范围[2,x],1 <= x <= 1000) 则 N1 到 Ny 全部元素出栈,重新入栈新元素M(M=2*N1) 如依次向栈存储6、1、…...

企业文件数据泄露防护(DLP)

什么是数据丢失防护 数据丢失防护 &#xff08;DLP&#xff09; 是保护数据不落入坏人之手的做法。如今&#xff0c;数据传输的主要问题是使大量数据容易受到未经授权的传输。通过设置足够的安全边界&#xff0c;您可以控制数据在网络中的移动。由于您的数据非常有价值&#x…...

不考虑分配与合并情况下,GO实现GCMarkSweep(标记清楚算法)

观前提醒 熟悉涉及到GC的最基本概念到底什么意思&#xff08;《垃圾回收的算法与实现》&#xff09;我用go实现&#xff08;因为其他的都忘了&#xff0c;(╬◣д◢)&#xff91;&#xff77;&#xff70;!!&#xff09; 源码地址&#xff08;你的点赞&#xff0c;是我开源的…...

利用HGT聚类单细胞多组学数据并推理生物网络

单细胞多组学数据允许同时对多种组学数据进行定量分析&#xff0c;以捕捉复杂的分子机制和细胞异质性。然而现有的工具不能有效地推断不同细胞类型的活性生物网络以及这些网络对外部刺激的反应。 来自&#xff1a;Single-cell biological network inference using a heterogen…...

杂记——18.VSCode的下载及使用

这篇文章&#xff0c;我们来讲一下VSCode&#xff0c;讲一下如何下载及使用VSCode 目录 1.VSCode的下载 1.1VSCode的简介 1.2VSCode的下载与安装 1.2.1下载 1.2.2安装 2.VSCode的使用 2.1界面 2.2基础设置 2.3禁用自动更新 2.3自动保存设置 2.4Vscode更换主题 2.5…...

Claude Code配置切换器:一键管理多AI服务环境变量

1. 项目概述&#xff1a;为什么我们需要一个Claude Code的配置切换器如果你和我一样&#xff0c;日常重度依赖Claude Code这个AI编程助手&#xff0c;那你肯定遇到过这个场景&#xff1a;今天想用智谱的GLM-4.5&#xff0c;明天想切到月之暗面的Kimi&#xff0c;后天可能又得用…...

AI编程助手色彩科学技能库:从OKLCH到APCA的现代色彩实践

1. 项目概述&#xff1a;一个为AI编程助手打造的“色彩科学专家”技能库如果你和我一样&#xff0c;经常在开发与色彩相关的工具、设计系统&#xff0c;或者需要向团队解释为什么某个颜色方案行不通时&#xff0c;总得反复查阅同一堆资料——那个讲解OKLAB色彩空间的视频、那篇…...

动态自适应网络:让AI模型根据输入复杂度智能调节算力与精度

1. 项目概述&#xff1a;当计算机视觉遇见能效瓶颈在边缘计算和移动设备上部署深度神经网络&#xff08;DNN&#xff09;进行计算机视觉任务&#xff0c;比如人脸识别、物体检测&#xff0c;已经不是什么新鲜事了。但一个老生常谈的痛点始终横在那里&#xff1a;算力、功耗和精…...

SkillPilot:AI编程助手技能一键管理与安全部署实战

1. 项目概述与核心价值最近在折腾AI编程助手的时候&#xff0c;发现了一个挺有意思的痛点&#xff1a;虽然Claude Code、Cursor这些工具都支持通过SKILL.md文件来扩展功能&#xff0c;但每次想找个新技能&#xff0c;都得手动去GitHub上翻找、下载、配置&#xff0c;还得担心代…...

Intel Wi-Fi 6 AX201网卡‘代码10’通病?华硕/戴尔/联想多品牌用户自救指南

Intel Wi-Fi 6 AX201网卡‘代码10’故障全解析与跨品牌解决方案 当你的笔记本突然无法连接Wi-Fi&#xff0c;设备管理器中那个带着黄色感叹号的Intel Wi-Fi 6 AX201网卡图标格外刺眼&#xff0c;显示着"该设备无法启动&#xff08;代码10&#xff09;"的提示——这不…...

S7-1200 PLC 五大核心实验精讲:从振荡电路到浮点数运算的仿真实战

1. 从零开始搭建S7-1200仿真环境 第一次接触西门子S7-1200 PLC时&#xff0c;我被它强大的功能和复杂的软件界面吓到了。后来发现只要掌握几个关键步骤&#xff0c;仿真环境搭建其实比想象中简单得多。这里分享我的踩坑经验&#xff0c;帮你省去80%的摸索时间。 首先需要安装…...

表面贴装TVS二极管选型与应用全解析

1. 表面贴装功率TVS二极管的核心优势解析在电信基站、工业控制系统等关键电力应用中&#xff0c;一次意外的浪涌事件可能导致数万元设备损坏和数小时系统宕机。传统通孔封装的TVS二极管虽然能提供基础保护&#xff0c;但实测数据显示其引线电感导致的额外电压尖峰可达60V以上。…...

NotebookLM与Google Drive整合性能瓶颈实测报告:单次索引超10万页PDF时,延迟突增217%的根源与绕行方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM与Google Drive整合性能瓶颈实测报告&#xff1a;单次索引超10万页PDF时&#xff0c;延迟突增217%的根源与绕行方案 延迟突增的核心成因 实测表明&#xff0c;当 NotebookLM 通过 Google Dr…...

结构化生成式AI驱动材料设计:从生物启发到实验验证的完整实践

1. 项目概述&#xff1a;当AI遇见材料科学&#xff0c;一场设计范式的革命“AI驱动材料科学”这个标题&#xff0c;听起来宏大又前沿&#xff0c;但它的内核其实非常具体和务实。作为一名在材料计算与实验交叉领域摸爬滚打了十多年的从业者&#xff0c;我亲眼见证了这场变革从概…...

从PC到移动:DRAM市场如何从周期性震荡走向结构性稳定

1. DRAM市场格局的深层演变&#xff1a;从周期性震荡到结构性稳定干了十几年硬件设计和供应链的活儿&#xff0c;我算是亲眼见证了DRAM这个行当的“过山车”行情。早些年&#xff0c;跟同行聊起内存&#xff0c;大家第一反应都是“又涨了&#xff1f;”或者“崩盘了&#xff1f…...