java代理模式
代理模式
为什么要学习代理模式?因为这是SpringAOP的底层! 【SpringAOP和SpingMVC}】
代理模式的分类:
-
静态代理
-
动态代理
代理就像这里的中介,帮助你去做向房东租房,你不能直接解出房东,而房东和中介是因为租房而联系在一起,所以租房是接口
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6pVz2Ts2-1677422310317)(java静态代理.assets/image-20230226102101840.png)]](https://img-blog.csdnimg.cn/28d5c7f92b5e41b3be017f69c36c6aaf.png)
静态代理
角色分析:
- 抽象角色(租房):一般使用接口和抽象类来解决
- 真实角色(房东):被代理的角色
- 代理角色(中介):代理真实角色,被代理真实角色后,我们一般会做一些附属工作
- 客户:访问代理对象的人
代码步骤:
-
接口
package com.hong;//租房 public interface Rent {public void rent(); } -
真实角色
package com.hong;public class Client {public static void main(String[] args) {//房东要租房子Host host = new Host();//代理,中介帮房东租房子,但是呢房东会加一些附属操作! // host.rent();Proxy proxy = new Proxy(host);//你不用面对房东,直接找中介即可proxy.rent();} } -
代理角色
package com.hong;public class Proxy implements Rent{private Host host;public Proxy(Host host) {this.host = host;}public Proxy() {}@Overridepublic void rent() {host.rent();seeHost();fare();hetong();}//看房public void seeHost(){System.out.println("中介带你看房");}public void hetong(){System.out.println("签合同");}//收中介费public void fare(){System.out.println("收中介费");} } -
客户端访问代理角色
package com.hong;//房东 public class Host implements Rent{@Overridepublic void rent() {System.out.println("房东要出租房子");} }
代理模式的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就就交给代理角色!实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
缺点:
- 一个真实角色就会产生一个代理角色;代码量会翻倍,开发效率会变低
AOP
用代理增加功能,不改动原有的代码,只改动代理类
package com.hong;//真实对象
public class UserServiceImpl implements UserService {@Overridepublic void add() {System.out.println("增加一个用户");}@Overridepublic void delete() {System.out.println("删除一个用户");}@Overridepublic void update() {System.out.println("修改了一个用户");}@Overridepublic void query() {System.out.println("查询了一个用户");}
}
package com.hong;public class UserServiceProxy implements UserService{private UserServiceImpl userservice;public void setUserservice(UserServiceImpl userservice) {this.userservice = userservice;}@Overridepublic void add() {log("add");userservice.add();}@Overridepublic void delete() {log("delete");userservice.delete();}@Overridepublic void update() {}@Overridepublic void query() {}public void log(String msg){System.out.println("调用"+msg+"方法");}
}
package com.hong;public interface UserService {public void add();public void delete();public void update();public void query();
}
package com.hong;public class Client {public static void main(String[] args) {UserServiceImpl userService = new UserServiceImpl();UserServiceProxy proxy = new UserServiceProxy();proxy.setUserservice(userService);proxy.add();}
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FhQMtFQi-1677422310319)(java静态代理.assets/image-20230226202716742.png)]](https://img-blog.csdnimg.cn/9a4923a85db34097bddb176c744398c6.png)
动态代理
- 动态代理和静态代理角色一样
- 动态代理类是动态生成的,不是我们直接写好的
- 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
- 基于接口—JDK动态代理
- 基于类:cglib
- java字节码实现:javasist
需要了解两个类:proxy:代理,lnvocationHandler:调用处理程序
静态代理的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就就交给代理角色!实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务
- 一个动态代理,修改的成本极低
实现代码
动态代理
package com.hong.demo02;import com.hong.xxh.Rent;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;//自动生成代理
public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Object taget;public void setTaget(Object taget) {this.taget = taget;}//生成得到代理对象public Object getProxy() {return Proxy.newProxyInstance(this.getClass().getClassLoader(),taget.getClass().getInterfaces(),this);}//处理代理实例并返回结果public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = method.invoke(taget, args);return result;}
}
接口
package com.hong.demo02;public interface UserService {public void add();public void delete();public void update();public void query();
}
真实对象
package com.hong.demo02;//真实对象
public class UserServiceImpl implements UserService {@Overridepublic void add() {System.out.println("增加一个用户");}@Overridepublic void delete() {System.out.println("删除一个用户");}@Overridepublic void update() {System.out.println("修改了一个用户");}@Overridepublic void query() {System.out.println("查询了一个用户");}
}
客户端访问
package com.hong.demo02;import com.hong.Proxy;
import com.hong.UserServiceImpl;public class ClenClient {public static void main(String[] args) {//真实角色UserServiceImpl userService = new UserServiceImpl();//代理角色ProxyInvocationHandler pih = new ProxyInvocationHandler();pih.setTaget(userService); //设置要代理的对象//动态生成代理UserService proxy = (UserService) pih.getProxy();proxy.delete();}
}
反序列化中动态代理的利用
我们将入口类定义为A,我们最理想的情况是 A[O] -> O.f,那么我们将传进去的参数O替换为B即可。但是在实战的情况下这种情况是极少的。
回到实战情况,比如我们的入口类A存在O.abc这个方法,也就是 A[O] -> O.abc;而 O 呢,如果是一个动态代理类,O的invoke方法里存在.f的方法,便可以漏洞利用了,我们还是展示一下。
A[O] -> O.abc O[O2] invoke -> O2.f // 此时将 B 去替换
O2 最后 ----> O[B] invoke -> B.f // 达到漏洞利用效果
就像readObject在反序列化中自动调用,invoke在动态代理的时候也自动调用,如果我们在invoke插入恶意代码,就可进行攻击例如
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XAkzDHfq-1677422310320)(java静态代理.assets/image-20230226223422071.png)]](https://img-blog.csdnimg.cn/dc4cbf16ff4c48929f285c6eb5b38f87.png)
结果

相关文章:
java代理模式
代理模式 为什么要学习代理模式?因为这是SpringAOP的底层! 【SpringAOP和SpingMVC}】 代理模式的分类: 静态代理 动态代理 代理就像这里的中介,帮助你去做向房东租房,你不能直接解出房东,而房东和中介…...
JUC包:CountDownLatch源码+实例讲解
1 缘起 有一次听到同事谈及AQS时,我有很多点懵, 只知道入队和出队,CLH(Craig,Landin and Hagersten)锁,并不了解AQS的应用, 同时结合之前遇到的多线程等待应用场景,发现…...
Log4j2基本使用
文章目录1. Log4j2入门2. Log4j2配置3. Log4j2异步日志4. Log4j2的性能Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带 来了一些重大的提升,主要有: 异常处理,…...
A2L在CAN FD总线的使用
文章目录 前言CAN时间参数BTL CyclesTime Quantum时间份额SWJ同步跳转宽度波特率计算采样点计算CAN FD的第二采样点SSP推荐配置A2L配置总结前言 A2L作为XCP标定协议的载体,包括了总线信息的定义。本文介绍如何将基于CAN总线的A2L扩展为支持CAN-FD的A2L CAN时间参数 在介绍配…...
Android JetPack之启动优化StartUp初始化组件的详解和使用
一、背景 先看一下Android系统架构图 在Android设备中,设备先通电(PowerManager),然后加载内核层,内核走完,开始检查硬件,以及为硬件提供的公开接口,然后进入到库的加载。库挂载后开…...
[11]云计算|简答题|案例分析|云交付|云部署|负载均衡器|时间戳
升级学校云系统我们学校要根据目前学生互联网在线学习、教师教学资源电子化、教学评价过程化精细化的需求,计划升级为云教学系统。请同学们根据学校发展实际考虑云交付模型包含哪些?云部署采用什么模型最合适?请具体说明。9月3日买电脑还是租…...
C++11/C++14:lambda表达式
概念 lambda表达式:是一种表达式,是源代码的组成部分闭包:是lambda表达式创建的运行期对象,根据不同的捕获模式,闭包会持有数据的副本或引用闭包类:用于实例化闭包的类,每个lambda表达式都会触…...
算法课堂-分治算法
分治算法 把一任务分成几部分(通常是两部分)来完成(或只完成一部分),从而实现整个任务的完成 或者你可以把递归理解为分治算法的一部分 因为递归就是把问题分解来解决问题 例子 称假币 最笨的方法:两两称…...
操作系统权限提升(十六)之绕过UAC提权-CVE-2019-1388 UAC提权
系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 操作系统权限提升(十四)之绕过UAC提权-基于白名单AutoElevate绕过UAC提权 操作系统权限提升(十五)之绕过UAC提权-基于白名单DLL劫持绕过UAC提权 注&a…...
实例9:四足机器人运动学正解平面RR单腿可视化
实例9:四足机器人正向运动学单腿可视化 实验目的 通过动手实践,搭建mini pupper四足机器人的腿部,掌握机器人单腿结构。通过理论学习,熟悉几何法、旋转矩阵法在运动学正解(FK)中的用处。通过编程实践&…...
堆的基本存储
一、概念及其介绍堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。堆满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树。二、适用说明堆是利用完全二叉树的结构来维护一组数…...
如何获取物体立体信息通过一个相机
大家都知道的3D 技术是通过双眼视觉差异 得到的 但是3D的深度并没有那么强 为什么眼睛看到的就那么强 这无法让我们相信这个视觉差理论是和人眼睛立体感是一个原理 这个如今3D 电影都在用的技术 是和真正的人眼立体感 不一样的 或者说是有瑕疵的 分析一下现在的立体感技术 是通…...
【数据挖掘实战】——中医证型的关联规则挖掘(Apriori算法)
目录 一、背景和挖掘目标 1、问题背景 2、传统方法的缺陷 3、原始数据情况 4、挖掘目标 二、分析方法和过程 1、初步分析 2、总体过程 第1步:数据获取 第2步:数据预处理 第3步:构建模型 三、思考和总结 项目地址:Data…...
一些硬件学习的注意事项与快捷方法
xilinx系列软件 系统适用版本 要安装在Ubuntu系统的话,要注意提前看好软件适用的版本,不要随便安好了Ubuntu系统又发现对应版本的xilinx软件不支持。 如下图,发行说明中会说明这个版本的软件所适配的系统版本。 下载 vivado vitis这些都可以…...
【Tomcat】Tomcat安装及环境配置
文章目录什么是Tomcat为什么我们需要用到Tomcattomcat下载及安装1、进入官网www.apache.org,找到Projects中的project List2、下载之后,解压3、找到tomcat目录下的startup.bat文件,双击之后最后结果出现多少多少秒,表示安装成功4、…...
负载均衡:LVS 笔记(二)
文章目录LVS 二层负载均衡机制LVS 三层负载均衡机制LVS 四层负载均衡机制LVS 调度算法轮叫调度(RR)加权轮叫调度(WRR)最小连接调度(LC)加权最小连接调度(WLC)基于局部性的最少链接调…...
SEO优化:干货技巧分享,包新站1-15天100%收录首页
不管是老域名还是新域名,不管是多久没有收录首页的站,此法周期7-30天,包首页收录!本人不喜欢空吹牛逼不实践的理论,公布具体操作:假如你想收录的域名是a.com,那么准备如下材料1.购买5-10个最便宜…...
JavaWeb测试题
【第四小组】【姓名:郑梦飞】说明:上方【组】填入所在的组,上方【姓名】填入自己的真实姓名。答题方式,基于Word文档基础上答题编程题可利用工具编程完以后,复制到该文档内。答完以后,导成PDF。以姓名.PDF命…...
Java EE|TCP/IP协议栈之数据链路层协议详解
文章目录一、数据链路层协议感性认识数据链路层简介以太网简介特点二、以太网数据帧格式详解帧头不同类型对应的载荷三、关于MTU什么是MTUMTU有什么作用ip分片(了解)参考一、数据链路层协议感性认识 数据链路层简介 从上图可以看出 , 在TCP/…...
Lighthouse组合Puppeteer检测页面
如上一篇文章lighthouse的介绍和基本使用方法结尾提到的一样,我们在实际使用Lighthouse检测页面性能时,通常需要一定的业务前置条件,比如最常见的登录操作、如果没有登录态就没有办法访问其他页面。再比如有一些页面是需要进行一系列的操作&a…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
