【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.hqwc.cn/news/695909.html

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

相关文章

iZotope RX 11 for Mac:音频修复的终极利器

在音频制作的浩瀚星海中,每一份声音都是珍贵的宝石,但往往被各种噪音、杂音所掩盖。此刻,iZotope RX 11 for Mac犹如一位专业的匠人,以其精湛的技术,将每一份声音雕琢至完美。 iZotope RX 11 for Mac,这是…

关于SQL

数据库简介: 数据库分类 关系型数据库模型: 优点:易于维护,可以实现复杂的查询 缺点:海量数据 读取写入性能差,高并发下数据库的io是瓶颈 是把复杂的数据结构归结为简单的二元关系(即二维表…

免费的集成组件有哪些?

集成组件是指将多个软件或系统进行整合,以实现更高效、更可靠的数据处理和管理。在数据管理和分析领域,集成组件是不可或缺的工具之一。 在当今高度信息化的时代,集成组件在各行各业的应用中扮演着举足轻重的角色。集成组件能够将不同来源的…

从头开始学Spring—01Spring介绍和IOC容器思想

目录 1.Spring介绍 1.1Spring概述 1.2特性 1.3五大功能模块 2.IOC容器 2.1IOC思想 ①获取资源的传统方式 ②反转控制方式获取资源 ③DI 2.2IOC容器在Spring中的实现 ①BeanFactory ②ApplicationContext ③ApplicationContext的主要实现类 1.Spring介绍 1.1Sprin…

如何利用甘特图来提高资源的是使用效率?

在项目管理中,甘特图是一种常用的工具,用于规划和跟踪项目进度。它通过条形图的形式展示项目的时间表和任务依赖关系,帮助项目经理和团队成员清晰地了解项目的时间线和进度。通过合理利用甘特图,可以显著提高资源的使用效率&#…

基于SPWM控制策略的二极管钳位型NPC逆变器的并网simulink仿真

本人搭建了二极管钳位型NPC并网逆变器simulink仿真模型,该模型型采用d、q轴,电压前馈解耦控制,三相逆变并网,PI控制,仿真复现,效果优异,适合新手学习使用。 模型获取链接:基于SPWM…

解聘7名教授!高校取消终身教授制度,启动全员“末位淘汰”

如今,高校是越来越卷了,身处其中的每个人似乎都无法避免。 前一段时间,国内某985高校说是要搞职称降级聘任,另一所985高校说要淘汰多少比例的教师,引发学术圈广泛讨论。 国外呢,同样要卷起来了&#xff0…

结构体补充-位段

文章目录 位段介绍位段内存分配位段的使用注意事项结束 位段介绍 为什么会有位段呢? 我们直到一个int是4个字节表示32个bit位,但是比如2,3这样的整数,我们只需要2个bit位就可以了,那30个比特位不就是浪费掉了吗,所以位段就产生了 位段通过结构体来实现,位段表示方法…

嵌入式:基于STM32的RFID访问控制系统

在商业和住宅建筑中,访问控制系统是确保安全的关键组件。使用射频识别(RFID)技术,我们可以创建一个安全、方便的门禁系统。本教程将详细说明如何使用STM32微控制器实现RFID基础的门禁系统,该系统能够控制电子锁并记录访…

WordPress 、Typecho 站点的 MySQL/MariaDB 数据库优化

今天明月给大家分享一下 WordPress 、Typecho 站点的 MySQL/MariaDB 数据库优化,无论你的站点采用是 WordPress 还是 Typecho,都要用到 MySQL/MariaDB 数据库,我们以 MySQL 为主(MariaDB 其实跟 MySQL 基本没啥大的区别&#xff0…

【重大故障】澳大利亚所有大学退休金数据被Google误删除,本地云服务总监被直接解雇

本周Google私有云发生重大故障,在维护UniSuper客户配置,误删除所有数据(包括异地备份数据), 客户最后通过其他供应商备份暂时已经恢复数据,但是系统还处于恢复中。 UniSuper 是一家澳大利亚退休金基金&…

图片转表格的免费软件,这几款值得收藏!

在数字化时代,图片转表格的需求日益增多。无论是工作汇报、数据分析还是学术研究,将图片中的信息转化为表格都能极大地提高工作效率。然而,许多人在面对这一任务时,往往感到无从下手。今天,我将为大家推荐几款免费的图…