一文梭哈动态代理
大家好,这里是教授.F
引入:
先看一个生活化的例子,如果一个明星他会唱歌,会跳舞。但是自己太忙了,没时间去宣传自己和去找工作,所以他需要有人帮他代理。然后呢这个代理者也需要知道他会什么,什么时间有空。
其实为什么要有动态代理,本质上是我们为了统一管理,让我们在一个方法执行前和执行后能进行一下业务操作。类似明星跟经纪人的关系。所以动态代理就是进行抽离出一些相同的业务。(其实就是切面编程)
如果我们没有使用代理,就会造成在唱歌前,自己这个方法去准备场地。跳舞前自己去安排老师去教。这样也会导致不够灵活:我们很难对唱歌这个方法进行控制。复用性也差:如果其他的类也有跟唱歌前一样的操作(比如:准备场地),那这样就不能使用到这个业务操作了。
看来上面的例子,折射到我们代码中的动态代理就是这样:

代理的这个类,怎么知道这个明星会什么呢?就需要一个接口,存着这位明星会的技能。
更详细一点的说明:

在实际代码的编写中,我们需要有一个类能返回一个代理对象。
核心代码:
public (接口) getProxy(){//得到类加载器......//得到要代理的对象/被执行对象的接口信息,底层是通过接口来完成......//创建InvocationHandler 对象....../*** public static Object newProxyInstance(ClassLoader loader,* Class<?>[] interfaces,* InvocationHandler h)* Proxy.newProxyInstance()可以返回一个代理对象* ClassLoader loader类的加载器* Class<?>[] interfaces 将来要代理的对象的接口信息* InvocationHandler h 调用处理器/对象 有一个方法非常重要 invoke***/接口 proxy = (接口)Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
}实际代码示例:
package com.hspedu.spring.proxy2;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 该类可以返回一个代理对象*/
public class VehicleProxyProvider {//定义一个属性//target_vehicle 表示真正要执行的对象//该对象实现Vehicle接口private Vehicle target_vehicle;//构造器public VehicleProxyProvider(Vehicle target_vehicle) {this.target_vehicle = target_vehicle;}//编写一个方法,可以返回一个代理对象public Vehicle getProxy(){//得到类加载器ClassLoader classLoader = target_vehicle.getClass().getClassLoader();//得到要代理的对象/被执行对象的接口信息,底层是通过接口来完成Class<?>[] interfaces = target_vehicle.getClass().getInterfaces();//创建InvocationHandler 对象/*** public interface InvocationHandler {//接口不能实例化,那怎么得到该对象呢?使用匿名内部类的方式来创建。* public Object invoke(Object proxy, Method method, Object[] args)* throws Throwable;* }*/InvocationHandler invocationHandler = new InvocationHandler(){/*** invoke 方法是将来执行我们的target_Vehicle的方法时,会调用到* @param proxy the proxy instance that the method was invoked on 表示代理对象** @param method the {@code Method} instance corresponding to 就是通过代理对象调用方法时的那个方法,代理对象.run()* the interface method invoked on the proxy instance. The declaring* class of the {@code Method} object will be the interface that* the method was declared in, which may be a superinterface of the* proxy interface that the proxy class inherits the method through.** @param args an array of objects containing the values of the 表示调用 代理对象.run(xx) 传入的参数* arguments passed in the method invocation on the proxy instance,* or {@code null} if interface method takes no arguments.* Arguments of primitive types are wrapped in instances of the* appropriate primitive wrapper class, such as* {@code java.lang.Integer} or {@code java.lang.Boolean}.** @return 表示代理对象.run(xx)执行后的结果* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("交通工具开始运行");//method是?:public abstract void com.hspedu.spring.proxy2.Vehicle.run()//target_vehicle?:ship对象,//args?:null【因为没有传值】Object result = method.invoke(target_vehicle,args);System.out.println("交通工具停止运行");return result;}};/*** public static Object newProxyInstance(ClassLoader loader,* Class<?>[] interfaces,* InvocationHandler h)* Proxy.newProxyInstance()可以返回一个代理对象* ClassLoader loader类的加载器* Class<?>[] interfaces 将来要代理的对象的接口信息* InvocationHandler h 调用处理器/对象 有一个方法非常重要 invoke***/Vehicle proxy = (Vehicle)Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);return proxy;}
}
相关文章:
一文梭哈动态代理
大家好,这里是教授.F 引入: 先看一个生活化的例子,如果一个明星他会唱歌,会跳舞。但是自己太忙了,没时间去宣传自己和去找工作,所以他需要有人帮他代理。然后呢这个代理者也需要知道他会什么,什…...
如何查询Windows 10电脑的IP地址
如何查询Windows 10电脑的IP地址 引言 在Windows 10操作系统中,查询电脑的IP地址是一项基本而重要的任务,无论是为了配置网络、解决连接问题,还是进行远程访问。 基础知识 IP地址:互联网协议地址,用于标识网络中的…...
java: 警告: 源发行版 8 需要目标发行版 8
前言 该文章中项目背景是:IDEA与设置的版本与实际电脑配置的不一致。也就是说只改了这个团队项目的JDK版本,IDEA上其它项目JDK版本未更改。 提示: IDEA警告:javaX:警告:源发行版 需要目标发行版 简略步…...
CCF-CSP认证 2023年12月 2.因子化简
题解: 通过质数筛法,用个板子函数就行了,计算出质数系数就行了 #pragma GCC optimize(2, 3, "Ofast", "inline") #include <bits/stdc.h> #define endl \n using namespace std; long long int num; const int M…...
基于Vue2与3版本的Element UI与Element Plus入门
基于Vue2与3版本的Element UI与Element Plus入门 Element UI 入门安装引入 Element UI使用组件 Element Plus 入门安装引入 Element Plus使用组件 常用组件自定义主题兼容性和升级社区和支持 Element UI 入门 Element UI 是基于 Vue 2.0 的桌面端组件库,它提供了一…...
Mysql数据库创建自增序列
创建序列表 CREATE TABLE sequence (name varchar(50) NOT NULL,current_value bigint(30) NOT NULL,increment int(11) NOT NULL DEFAULT 1 ) ENGINEInnoDB DEFAULT CHARSETutf8 ROW_FORMATDYNAMIC COMMENT序列表;创建函数 查询当前序列名的序列值 CREATE DEFINERroot% FUNC…...
macOS上用Qt creator编译并跑shotcut
1 简介 Shotcut是一个开源的跨平台的视频编辑软件,支持WIN/MACOS/LINUX等平台,由于该项目的编译较为麻烦,踩坑几许,因此写此文章记录完整编译构建过程,后续按此法编译,可减少走弯路,提高生产力。…...
基于高光谱数据集的创新点实现-高斯核函数卷积神经网络
一、高光谱数据集简介 1.1 数据集简介 数据集链接在这:高光谱数据集(.mat.csv)-科研学术 数据集包含下面三个文件: 文件中包含.mat与.csv,145x145x220, 其实主要使用avirissub.csv文件,在代码上只是将mat文件转成了csv文件。具体avirissub.csv如下&am…...
【python 进阶】 绘图
1. 将多个柱状绘制在一个图中 import seaborn as sns import matplotlib.pyplot as plt import numpy as np import pandas as pd# 创建示例数据 categories [A, B, C, D, E] values1 np.random.randint(1, 10, sizelen(categories)) values2 np.random.randint(1, 10, siz…...
memblock_free_all释放page到buddy,前后nr_free的情况
https://www.cnblogs.com/tolimit/p/5287801.html 在zone_sizes_init 之后,各个node,zone的page总数已知。但是此时的每个order的空闲链表是空的,也就是无法通过alloc_page这种接口来分配。此时page还在memblock管控,需要memblock…...
Django实现websocket
Django实现websocket WebSocket功能使用介绍安装配置WebSocket接口--消息接收者的实现scope通道层 channel layer部署Web客户端连接Mac客户端 WebSocket功能 WebSocket长连接一般用于实现实时功能,例如web端的消息通知、会话等场景。 使用 WebSocket 向 Django 项…...
先进制造aps专题九 中国aps行业分析
国外aps的问题是不给国内客户定制算法 国外aps的算法都很强大,考虑几百个约束条件,各种复杂的工序关系,还有副资源约束特殊规格约束,排程还优化,光c写的算法代码就几十万行甚至上百万行 国内aps的问题是实现不了复杂的…...
力扣hot100:23. 合并 K 个升序链表
23. 合并 K 个升序链表 这题非常容易想到归并排序的思路,俩升序序列合并,可以使用归并的方法。 不过这里显然是一个多路归并排序;包含多个子数组的归并算法,这可以让我们拓展归并算法的思路。 假设n是序列个数,ni是…...
Lightweight Robust Size Aware Cache Management——论文泛读
TOC 2022 Paper 论文阅读笔记整理 问题 现代键值存储、对象存储、互联网代理缓存和内容交付网络(CDN)通常管理不同大小的对象,例如,Blob、不同长度的视频文件、不同分辨率的图像和小文件。在这种工作负载中,大小感知…...
搜索自动补全-elasticsearch实现
1. elasticsearch准备 1.1 拼音分词器 github地址:https://github.com/infinilabs/analysis-pinyin/releases?page6 必须与elasticsearch的版本相同 第四步,重启es docker restart es1.2 定义索引库 PUT /app_info_article {"settings": …...
连接远程的kafka【linux】
# 连接远程的kafka【linux】 前言版权推荐连接远程的kafka【linux】一、开放防火墙端口二、本地测试是否能访问端口三、远程kafka配置四、开启远程kakfa五、本地测试能否连接远程六、SpringBoot测试连接 遇到的问题最后 前言 2024-5-14 18:45:48 以下内容源自《【linux】》 仅…...
简单的 Cython 示例
1, pyx文件 fibonacci.pyx def fibonacci_old(n):if n < 0:return 0elif n 1:return 1else:return fibonacci_old(n-1) fibonacci_old(n-2) 2,setup.py setup.py from setuptools import setup from Cython.Build import cythonizesetup(ext_mod…...
Laravel时间处理类Carbon
时间和日期处理是非常常见的任务。Carbon 是一个功能强大的 PHP 扩展包,它为我们提供了许多方便的方法来处理日期和时间。在 Laravel 中,你无需单独安装 Carbon,因为 Laravel 默认已经包含了它。如果你正在使用 Laravel,那么你已经…...
2024年5月软考架构题目回忆分享
十年架构两茫茫 ,Redis , UML 夜来幽梦忽还乡 , 大数据, Lambda 选择题 1.需求分析和架构设计面临这两个不同对象,一个是问题空间,一个是解空间 这是英文题,总共五个题目,只记得这么多 2. …...
香橙派 AIpro开发板初上手
一、香橙派 AIpro开箱 最近拿到了香橙派 AIpro(OrangePi AIpro),下面就是里面的板子和相关的配件。包含主板、散热组件、电源适配器、双C口电源线、32GB SD卡。我手上的这个是8G LPDDR4X运存的版本。 OrangePi AIpro开发板是一款由香橙派与华…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
