【java】代理

news2025/1/20 18:28:06
什么是代理

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

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

代理如何实现
基于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();
    //这个地方就是核心方法
    @Override
    public 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{
    @Override
    public 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()方法中所得到的接口信息,得到核心方法
    //我们只需要用反射的方式执行这些方法
    @Override
    public 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.coloradmin.cn/o/1674040.html

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

相关文章

[XYCTF]-PWN:Intermittent解析(pop栈内数据构造shellcode,自己编写shellcode)

查看ida 这里程序只会把输入的前12字节内容移到虚拟地址里,然后执行,大小不足以让执行shellcode,只能用pop寄存器调用read,再把gets hell的shellcode输入进去 完整exp: from pwn import* context(log_leveldebug,arc…

一个完美的回到顶部按钮

大家好,我是 Just,这里是「设计师工作日常」,今天给大家写了一个丝滑回到顶部的按钮,原生js实现的,兼容性所有主流浏览器,可在vue中使用,适用于网页、h5等。 最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码js 部分代码完整代…

Funakoshi — LipiDye Ⅱ脂滴活细胞成像试剂

Funakoshi LipiDye II是一款适用于长时间活细胞成像以观察动态脂滴(LDS)合成、移动或降解的绿色荧光染料;是LipiDye(货号:FDV-0010)的升级版,同时具备超强的光稳定性和高灵敏度等特点。 ➧ 产品…

信创改造1---TongLINK/Q安装部署

1. 准备工作 创建用户和组权限 groupadd -g 600 tlq useradd -d /home/tlq -g 600 tlq chown tlq:tlq /home/tlq chmod 755 /home/tlq给自己创建的用户设置密码 passwd tlq根据自己的服务器上传对应的包并解压 2. 上传授权文件 上传license.bat文件到…

如何查看Spring Boot 默认的数据库连接池类型

使用的Spring Boot的版本&#xff1a;2.3.4.RELEASE 先给出答案&#xff1a;com.zaxxer.hikari.HikariDataSource 怎么知道的呢&#xff1f; 新建一个Spring boot项目&#xff1a;springbootTest 配置pom.xml <dependencies><!-- SpringBoot 核心包 --><de…

STM32 CANFD 基础知识留档

讲得比较细的文章但可能有问题自行判定 附1 附2 前言 CAN2.0 协议中数据段波特率和仲裁段波特率默认是一致&#xff0c;因此只需要关注传输波特率即可 CANFD 协议是向下兼容 CAN2.0 的数据通讯&#xff0c;因此实际使用中需要配置 STM32H7 系列支持的标准是 Compliant with …

VC++6.0使用Resource文件来生成必备的支撑文件

目的&#xff1a;&#xff08;1&#xff09;使用exe自己资源文件来创建支撑的dll文件或者配置文件&#xff0c;这样可以在开发绿色软件的时候只需要拷贝一个exe可执行文件就可以独立运行。 &#xff08;2&#xff09;防止误删配套文件导致exe应用无法执行。 &#xff08;3&am…

汇编语言程序设计-2-访问寄存器和内存

2. 访问寄存器和内存 文章目录 2. 访问寄存器和内存2.0 导学2.1 寄存器及数据存储2.2 mov和add指令2.3 确定物理地址的方法2.4 内存的分段表示法2.5 Debug的使用2.6 【代码段】CS、IP与代码段2.7 【代码段】jmp指令2.8 【数据段】内存中字的存储2.9 【数据段】用DS和[address]实…

傻瓜化备份/恢复K8S集群Etcd数据

前言&#xff1a; 备份重要数据&#xff0c;简化重复操作&#xff0c;让一指禅、点点点也能完成运维任务。 脚本呈现界面如下&#xff1a; 1、查看Etcd版本 rootmaster:~# cat /etc/kubernetes/manifests/etcd.yaml | grep image: | awk {print $2} registry.aliyuncs.com/goo…

企业运维背后的故事:TASKCTL带你了解日常工作与技术演进

今天&#xff0c;作为一名经验丰富、从业多年经常与运维人员打交道的人&#xff0c;我想与大家聊聊运维的日常工作、部门协调以及未来发展&#xff0c;希望能为即将转行或正在从事运维工作的你&#xff0c;提供一些新的视角和启发。 运维的日常工作&#xff1a;挑战与乐趣并存 …

【密评】 | 商用密码应用安全性评估从业人员考核题库(11)

字母频率分析法对&#xff08;&#xff09;算法最有效。 A.置换密码 B.单表代换密码 C.多表代换密码 D.序列密码 GM/Z4001《密码术语》中&#xff0c;保证信息不被泄露给非授权的个人、进程等实体的性质称为密码的&#xff08;&#xff09;。 A.真实性 B.完整性 C.机密性 D.不…

LCD和OLED的区别

这里写目录标题 什么是LCD&#xff1f;什么是LED/OLEDLED和OLED的发光原理LCD的缺陷OLED屏幕的优势OLED屏幕的劣势 什么是LCD&#xff1f; LCD 英文全称 Liquid Crystal Display &#xff0c;中文翻译为液晶显示器。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒&#xff0…

Visual Studio Community : The prerelease has expired

最近使用旧版的离线安装包安装社区版Visual Studio2022&#xff08;Visual Studio Community 2022&#xff09;&#xff0c;安装完成后显示&#xff1a;The prerelease has expired。使用自己的微软账号登录还是一样的情况&#xff0c;只能强制退出。经过摸索后发现了一个解决方…

tab 滑动小案例

效果&#xff1a; 代码&#xff1a; <template><view class"content"><view class"tab"><view v-for"(item,index) in dataList" :key"index" class"tab_item" click"slideTab(index)">…

爱普生MCU系列语音芯片S1C31D41

随着科技的发展和产品的集成化&#xff0c;语音芯片已经逐渐替代了多种语音设备应用在各场合。语音芯片主要特性是功耗低&#xff0c;抗干扰能力强&#xff0c;外围器件少&#xff0c;控制简单&#xff0c;语音保存时间久(某些语音芯片可以保存内容100年)&#xff0c;掉电不丢失…

java 解决跨域时遇到问题,怎么来做一个跨域环境

今天遇到一个问题&#xff1a; 关于#java#的问题&#xff1a;java 解决跨域时遇到问题&#xff1a;为什么跨域访问时配置的CorsFilter没有进入&#xff1f;直接访问请求地址时进入了配置的CorsFilter 由于没有实际的跨域环境&#xff0c;因此打算在本机建一个跨域环境&#xff…

钉钉对接打通金蝶云星空获取流程实例(宜搭)接口与付款单新增接口

钉钉对接打通金蝶云星空获取流程实例&#xff08;宜搭&#xff09;接口与付款单新增接口 对接系统钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台&#xff0c;提供PC版&#xff0c;Web版和手机版&#xff0c;有考勤打卡、…

如何安全高效地进行4S店文件分发,保护核心资产?

4S店与总部之间的文件分发是确保双方沟通顺畅、信息共享和决策支持的重要环节。4S店文件分发涉及到以下文件类型&#xff1a; 销售报告&#xff1a;4S店需要定期向总部提交销售报告&#xff0c;包括销售数量、销售额、市场份额等关键指标。 库存管理文件&#xff1a;包括车辆库…

HTML满屏漂浮爱心

目录 写在前面 满屏爱心 代码分析 系列推荐 写在最后 写在前面 小编给大家准备了满屏漂浮爱心代码&#xff0c;一起来看看吧~ 满屏爱心 文件heart.svg <svg xmlns"http://www.w3.org/2000/svg" width"473.8px" height"408.6px" view…

SpringBoot设置默认文件大小

1、问题发现 有个需求&#xff0c;上传文件的时候&#xff0c;发现提示了这个错误&#xff0c;看了一下意思是说&#xff0c;文件超过了1M。 看我们文件的大小&#xff1a; 发现确实是&#xff0c;文件超出了1M&#xff0c;查了一下资料&#xff0c;tomcat默认上传文件大小为1M…