【java】代理

什么是代理

假设有一个核心方法叫转账,为了安全性考虑,不能让用户直接访问接口。此时涉及到了代理,这使得用户只能访问代理类,增加了访问限制。

代理的定义:给目标对象提供一个代理对象,并且由代理对象控制着对目标对象的引用。

代理如何实现
基于JDK的代理
① 静态代理

由代理类代理目标类:

目标类生成一个目标对象,代理类首先会生成代理对象,代理对象代理目标对象,普通用户只能访问代理对象。

一个类中可能有很多方法,代理类怎么知道代理目标类的哪个方法呢?除了直接写过去,我们还可以接口当中定义目标类当中需要被代理的方法。让目标类实现一个接口,同时代理类也去实现这个接口。

注意:实现接口的是类,而用户访问的是对象。

为什么有接口:接口定义的方法其子类必须实现让目标类实现在接口当中定义的核心方法(目标类实现了接口),为了通知代理类代理目标类当中的哪个核心方法,我们也让代理类实现接口。

在具体实现的过程中,为了保证职能的单一性,功能增强部分的代码最好不写在目标类里。

如何实现静态代理
public interface ByClothes {  //代理类和目标类都要继承该接口//在接口当中定义需要代理的方法public void clothes(String size) ;
}
public class ClothesFactory implements ByClothes{  //目标类 :制作衣服public void clothes(String size) {  //目标类的核心System.out.println("已经为您定制好了一件大小为" + size + "的衣服");}
}
public class StaticProxy implements ByClothes{  //代理类private ClothesFactory clothesFactory = new ClothesFactory();//这个地方就是核心方法@Overridepublic void clothes(String size) {front();  //功能增强clothesFactory.clothes(size);  //核心方法end();  //功能增强}public void front() {System.out.println("市场调研");}public void end() {System.out.println("售后服务");}
}
public class Test { //用户public static void main(String[] args) {StaticProxy proxy = new StaticProxy();proxy.clothes("XXXL");}
}
运行结果

 

② 动态代理

动态代理指的是一个代理类代理多个目标类。

如何实现?类是创建对象的模板

一个代理类生成多个代理对象即可。

 为了实现动态化,我们要想办法告诉代码想要代理的是什么。

 如何实现动态代理
public interface ByClothes {  //代理类和目标类都要继承该接口//在接口当中定义需要代理的方法public void clothes(String size) ;
}
public interface ByShoes {public void shoes(Integer size); //接口当中不需要具体实现
}
public class ClothesFactory implements ByClothes{  //目标类 :制作衣服public void clothes(String size) {  //目标类的核心System.out.println("已经为您定制好了一件大小为" + size + "的衣服");}
}
public class ShoesFactory implements ByShoes{@Overridepublic void shoes(Integer size) {System.out.println("已经为您定制了大小为" + size + "码的鞋子");}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class DTProxy implements InvocationHandler {//被代理的对象private Object factory;public DTProxy(Object factory) {this.factory = factory;}//为了能够动态的去实现新增的接口//factory.getClass() ---------> 对象名.getClass() == class.forName("全类名")  //生成代理对象public Object getProxyInstance() {return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);}//我们会根据getProxyInstance()方法中所得到的接口信息,得到核心方法//我们只需要用反射的方式执行这些方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {method.invoke(factory, args);return null;}
}
public class Test {public static void main(String[] args) {ClothesFactory clothesFactory = new ClothesFactory();DTProxy p1 = new DTProxy(clothesFactory);ByClothes c1 = (ByClothes) p1.getProxyInstance();c1.clothes("XXL");ShoesFactory shoesFactory = new ShoesFactory();DTProxy p2 = new DTProxy(shoesFactory);ByShoes c2 = (ByShoes) p2.getProxyInstance();c2.shoes(44);}
}
运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

果蔬经营平台|基于SSM+vue的果蔬经营平台系统的设计与实现(源码+数据库+文档)

果蔬经营平台系统 目录 基于SSM+vue的果蔬经营平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介…

Python面试50题!面试巩固必看!

题目001: 在Python中如何实现单例模式。 点评:单例模式是指让一个类只能创建出唯一的实例,这个题目在面试中出现的频率极高,因为它考察的不仅仅是单例模式,更是对Python语言到底掌握到何种程度,建议大家用装饰器和元类…

【卫星影像三维重建-全流程代码实现】点云Mesh重构

点云—>Mesh模型 1.介绍1.1 背景1.2 效果示意 2 算法实现2.1 依赖库2.2 实验数据2.3 代码实现2.4 实验效果 3.总结 1.介绍 1.1 背景 (1)本文主要内容是将三维点云(离散的三维点)进行表面重建生成Mesh网格,之前有篇…

IP跳变是什么,有什么作用?

IP跳变,简单来说,就是用户在使用网络时,不固定使用一个IP地址,而是定期或根据需求切换到另一个IP地址。这种技术为用户在网络环境中提供了一定的灵活性和安全性。 首先,我们来看看IP跳变的具体实现方式。当用户需要切…

UML快速入门篇

目录 1. UML概述 2. 类的表示 2.1. 类的表示 2.2. 抽象类的表示 2.3. 接口的表示 3. 类的属性,方法,访问权限的表示 3.1. 类的属性 3.2. 类的方法 3.3. 类的权限 4. 类的关联 4.1. 单向关联 4.2. 双向关联 4.3. 自关联 4.4. 类的聚合 4.5.…

Lists.partition用法详解

文章目录 一、引入依赖二、用法三、输出 一、引入依赖 依赖于谷歌的guava 包 <!-- guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>28.1-jre</version></dependency&…

仿照el-upload 封装自己的上传控件(el-upload 移动端无法吊起相机)

input选择图片的那个选择在h5的时候在去年下半年突然无法无法出现唤醒相机的选项 不知道出现的原因 发现el-upload作为h5的时候无法吊起相机 又因为需要对服务端地址图片进行回显&#xff08;处于编辑功能的情况下 非新增 新增el-upload 可以实现回显&#xff09; 两个功…

如文所示:

影响 ConnectWise 的 ScreenConnect 远程桌面访问产品的严重漏洞已被广泛利用来传播勒索软件和其他类型的恶意软件。 ConnectWise 于 2 月 19 日通知客户&#xff0c;它已发布针对关键身份验证绕过缺陷和高严重性路径遍历问题的补丁。该安全漏洞当时没有 CVE 标识符。第二天&am…

绘唐3启动器怎么启动一键追爆款3正式版

绘唐3启动器怎么启动一键追爆款3正式版 工具入口 一.文案助手&#xff1a; 【注意&#xff01;&#xff01;】如果图片无显示&#xff0c;一般情况下被杀毒拦截&#xff0c;需关闭杀毒软件或者信任文件路径。 win10设置排除文件&#xff1a; 1.【新建工程】使用前先新建工程…

谷歌Gboard应用的语言模型创新:提升打字体验的隐私保护技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

blender cell fracture制作破碎效果,将一个模型破碎成多个模型

效果&#xff1a; 1.打开编辑-》偏好设置。搜索cell&#xff0c;勾选上如下图所示的&#xff0c;然后点击左下角菜单里的保存设置。 2.选中需要破碎的物体&#xff0c;按快捷键f3&#xff08;快速搜索插件&#xff09;&#xff0c;搜索cell fracture。 3.调整自己需要的参数配置…

广东省网络安全竞赛部分web,misc wp

我的队伍只做了5题&#xff0c;还是太菜了&#xff0c;本来不想发的&#xff0c;但是写都写了&#xff0c;还是水一篇博客吧 这里是我们队的wp misc1 给了一个压缩包&#xff0c;解压需要密码&#xff0c;用纯数字密码没跑出来&#xff0c;感觉可能不是要强跑&#xff0c;看…

今天开发了一款软件,我竟然只用敲了一个字母(文末揭晓)

软件课题&#xff1a;Python实现打印100内数学试题软件及开发过程 一、需求管理&#xff1a; 1.实现语言&#xff1a;Python 2.打印纸张&#xff1a;A4 3.铺满整张纸 4.打包成exe 先看效果&#xff1a; 1. 2.电脑打印预览 3.打印到A4纸效果&#xff08;晚上拍的&#x…

Java后端的接口参数两个interger 类型情况解决

get请求 &#xff0c;对应请求头 RequestParm, post请求&#xff0c; 对应请求体 &#xff0c;RequestBody 两个Integer参数情况 GetMapping("/insertStaffClass")public R<Void> insertStaffClass(RequestParam Integer staffId,RequestParam List<Integ…

Node.js全栈:从一个简单的例子开始

第一章&#xff1a;从一个简单的例子开始第二章&#xff1a;看官方文档的艺术第三章&#xff1a;浏览器显示一个网页 首先&#xff0c;在VSCode编辑器中打开一个没有任何文件的空目录&#xff0c;然后创建一个package.json文件。 为了方便大家复制&#xff0c;我把文件内容放到…

Pytorch的torch.nn.functional.cross_entropy的ignore_index细解

作用 ignore_index用于忽略ground-truth中某些不需要参与计算的类。假设有两类{0:背景&#xff0c;1&#xff1a;前景}&#xff0c;若想在计算交叉熵时忽略背景(0)类&#xff0c;则可令ignore_index0&#xff08;同理忽略前景计算可设ignore_index1&#xff09;。 代码示例 i…

使用Flask的send_file方法实现文件下载功能

文章目录 什么是send_file方法&#xff1f;如何在Flask应用中使用send_file方法&#xff1f;示例拓展处理文件不存在的情况设置下载文件的名称实现文件下载的权限控制 结论 在Web开发中&#xff0c;经常需要实现文件下载功能&#xff0c;而Python的Flask框架提供了方便的send_f…

华为手机恢复出厂设置后怎么还原数据?该如何预防数据丢失?

华为手机恢复出厂设置是将手机恢复到出厂时的初始状态&#xff0c;同时会删除所有用户数据和个人设置。如果不做任何预防措施&#xff0c;在恢复出厂设置后&#xff0c;您将丢失手机上的所有数据。那华为手机恢复出厂设置后怎么还原数据呢&#xff1f;以下是关于如何在华为手机…

新的语言学习系统: 记忆镶嵌

摘要 记忆镶嵌是由多个关联记忆网络协同工作来完成感兴趣的预测任务。与transformer类似,记忆镶嵌具有组合能力和上下文学习能力。与transformer不同,记忆镶嵌以相对透明的方式实现这些能力。该研究在玩具示例上展示了这些能力,并且还表明记忆镶嵌在中等规模语言建模任务上的表…

头歌(EduCoder):数据挖掘算法原理与实践 -- 决策树

【头歌】机器学习实训代码 第一关&#xff1a;决策树算法思想 1、下列说法正确的是&#xff1f;&#xff08; AB &#xff09; A、训练决策树的过程就是构建决策树的过程B、ID3算法是根据信息增益来构建决策树C、C4.5算法是根据基尼系数来构建决策树D、决策树模型的可理解性不…