java代理简单理解

一、什么是代理

举例说明:当我想买一台电脑,国内太贵了。委托好友A在国外帮忙买。

这个情节中我要实现的动作和好友实现的动作一样,都是买电脑。好友帮我完成了这个动作,这就是代理。

类A和类B都实现一个interface接口C,C规定了A和B要完成的动作。借助B类实现A类完成接口中的动作。

1.使用代理的场景?

(1)功能增强:B完成接口中的动作之余还做了别的事情

(2)控制访问:B不让A访问到目标类,只有通过B这个媒介,A才能访问

二、静态代理

静态代理就是:自己写类实现代理。

思路:一个接口C,一个代理类B,一个被代理类A。两个类都实现接口C,在B实现接口中的方法时调用A对象方法。

接口C:

public interface Singer {void singing();int dance();
}

被代理类A

public class Cai implements Singer {@Overridepublic void singing() {System.out.println("cai 唱歌");}@Overridepublic int dance() {System.out.println("tiaowu");return 0;}
}

 代理类A

public class Caidaili implements  Singer{private Singer cai = new Cai();@Overridepublic void singing() {System.out.println("先收钱");cai.singing();}@Overridepublic int dance() {System.out.println("先收钱");cai.dance();return 0;}
}

测试

public class Main {public static void main(String[] args) {Singer singer = new Caidaili();singer.singing();singer.dance();}
}

 静态代理的局限性:如果被代理类太多了,每个被代理类都要有一个代理。这样写的代理类就太多了。因此引入动态代理,动态决定被代理类。

三、动态代理

动态代理就是不需要自己写代理类了,通过反射或者继承实现。动态代理有两种模式:

(1)jdk动态代理

通过反射类实现代理

核心代码:

Proxy.newProxyInstance(被代理的类的类加载器,被代理类实现的接口,实现InvocationHandler的类对象)

返回:代理类对象

参数列表中:InvocationHandler接口(函数式接口)重写了invoke方法,重写代码中的核心:

被代理对象.方法()method.invoke(接口对象,参数)                  //表示调用这个接口中的方法

实例:

接口

public interface Singer {void dance();int singing();}

被代理类

public class Cai implements Singer {@Overridepublic void dance() {System.out.println("Cai 在跳舞");}@Overridepublic int singing() {System.out.println("Cai 在唱歌");return 0;}
}

jdk动态代理实现

public class Test1 {public static void main(String[] args) {Cai cai =new Cai();
//        Ruler ruler = new Ruler(cai);//构建了 以原被代理类为基准的代理类的一个对象// o 已经等同于 Student s = new Student(); 这个s了Object o = Proxy.newProxyInstance(Cai.class.getClassLoader(), new Class[]{Singer.class}, (proxy, method, args1) -> {System.out.println(proxy.getClass().toString());System.out.println("先收钱");Object returnVal = method.invoke(cai, args1);System.out.println("asdfasdf");return returnVal;});System.err.println(o.getClass().toString());if(o instanceof Singer){Singer singer =  (Singer)o;singer.dance();singer.singing();singer.toString();}}
}

(2)cglib动态代理

不写接口,通过继承关系重写方法实现代理

示例:

被代理类:

public class Singer {public void dance(){System.out.println("tiaowu");}public int singing(){System.out.println("changge");return 100;}
}

代理类:

public class SingerSub extends Singer {@Overridepublic void dance() {System.out.println("shouqian");super.dance();}@Overridepublic int singing() {System.out.println("shouqian");return super.singing();}
}

测试:

public class Main {public static void main(String[] args) {Singer singer = new SingerSub();singer.singing();singer.dance();}
}

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

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

相关文章

【LeetCode刷题笔记】LeetCode.24.两两交换链表中的节点

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

新手小白的pytorch学习第一弹-------张量

1 导入pytorch包 import torch2 创建张量&#xff08;tensor&#xff09; scalar标量 scalar torch.tensor(7) scalartensor(7)scalar.ndim查看scalar的维度&#xff0c;因为scalar是标量&#xff0c;所以维度为0 0scalar.shapetorch.Size([])torch.item()7vector&#xf…

Apache功能配置:访问控制、日志分割; 部署AWStats日志分析工具

目录 保持连接 访问控制 只允许指定ip访问 拒绝指定主机其他正常访问 用户授权 日志格式 日志分割 操作步骤 使用第三方工具cronolog分割日志 AWStats日志分析 操作步骤 访问AwStats分析系统 保持连接 Apache通过设置配置文件httpd-default.conf中相关的连接保持参…

基于Java的科大讯飞大模型API调用实现

写在前面&#xff1a;因为现在自己实习的公司新拓展的一个业务是结合AI的低代码平台&#xff0c;我负责后端的开发&#xff0c;之前一直都是直接使用gpt或者文心一言等ui界面来直接使用大模型&#xff0c;从来没有自己调接口过&#xff0c;所以本文记录一下自己第一次使用大模型…

源代码防泄漏的正确方法

为了保护公司的源代码不被泄露&#xff0c;IT企业可以采取一系列严格的安全措施。这些措施涵盖技术手段、管理策略和操作流程&#xff0c;形成多层次的防护体系做到源代码防泄漏工作。 技术手段 1、源代码加密&#xff1a; 采用高级加密标准&#xff08;AES&#xff09;或其他…

【QT】QComboBox允许输入查询,且不区分大小写

目录 0.简介 1.环境 2.详细代码 3.参考 0.简介 项目需求&#xff0c;原本有一个下拉框&#xff0c;但是条目太多&#xff0c;不好搜索&#xff0c;所以用户要求可以输入查找 修改前 &#xff1a; 修改后&#xff1a; 1.环境 windows11 vs-code qt5.12 2.详细代码 QComboB…

中小企业和数智化的距离,只差一块华为IdeaHub

每次谈及中小企业数智化的话题&#xff0c;被提到最多的总是“三不”难题&#xff0c;即不想转、不敢转、不会转。 为了破解这一困局&#xff0c;政府多次在工作报告中提到“深入开展中小企业数字化赋能专项行动”&#xff0c;并在各地为中小企业创新提供政策支持。此外&#…

Android --- Kotlin学习之路:基础语法学习笔记

------>可读可写变量 var name: String "Hello World";------>只读变量 val name: String "Hello World"------>类型推断 val name: String "Hello World" 可以写成 val name "Hello World"------>基本数据类型 1…

MD5加密和注册页面的编写

MD5加密 1.导入包 npm install --save ts-md5 2.使用方式 import { Md5 } from ts-md5; //md5加密后的密码 const md5PwdMd5.hashStr("123456").toUpperCase(); 遇见的问题及用到的技术 注册页面 register.vue代码 <template><div class"wappe…

从零开始学习嵌入式----Linux 命令行,常用命令速记指南

目录 一、文件操作 二、文本操作 三、系统管理 四、网络操作 五、其他常用命令 六、学习建议 在 Linux 世界里&#xff0c;命令行就像一把瑞士军刀&#xff0c;掌握了它&#xff0c;你就能游刃有余地操控整个系统。但面对茫茫多的命令&#xff0c;新手往往会感到无所适从…

关于Python中的字典你所不知道的七个技巧

01 引言 Python是我最喜欢的编程语言之一&#xff0c;它向来以其简单性、多功能性和可读性而闻名。 字典作为Python中最常使用的数据类型&#xff0c;大家几乎每个人都或多或少在项目中使用过字典&#xff0c;但是字典里有一些潜在的技巧可能并不是每个同学都会用到。 在本文…

相同含义但不同类型字段作为join条件时注意事项

假设表A和表B中都有表示学号的stu_id字段&#xff0c;但该字段在表A和表B中类型分别为bigint和string。当直接通过该字段进行join时&#xff0c;一般情况下可以得到我们预期的结果。 select a.stu_id from a as r join b as l on r.stu_id l.stu_id 但是如果学号长度较长的…

【UE5.1 角色练习】16-枪械射击——瞄准

目录 效果 步骤 一、瞄准时拉近摄像机位置 二、瞄准偏移 三、向指定方向射击 四、连发 效果 步骤 一、瞄准时拉近摄像机位置 打开角色蓝图&#xff0c;在事件图表中添加如下节点&#xff0c;当进入射击状态时设置目标臂长度为300&#xff0c;从而拉近视角。 但是这样切…

勇攀新高峰|暴雨信息召开2024年中述职工作会议

7月8日至9日&#xff0c;暴雨信息召开2024年中述职工作会议&#xff0c;总结回顾了上半年的成绩和不足&#xff0c;本次会议采用线上线下的方式举行&#xff0c;公司各部门管理人员、前台市场营销人员参加述职&#xff0c;公司领导班子出席会议。 本次述职采取了现场汇报点评的…

关于宏v4l2_subdev_call的拆解

struct v4l2_subdev *sd结构体 struct v4l2_subdev { #if defined(CONFIG_MEDIA_CONTROLLER)struct media_entity entity; #endifstruct list_head list;struct module *owner;bool owner_v4l2_dev;u32 flags;struct v4l2_device *v4l2_dev;const struct v4l2_subdev_ops *op…

数字滚动动画~

前言 数字从0.00滚动到某个数值的动画 实现&#xff08;React版本&#xff09; Dom <div className"number" ref{numberRef}>0.00</div> JS const _initNumber () > {const targetNumber 15454547.69;const duration 1500;const numberElement…

vivado DRIVE、EDIF_EXTRA_SEARCH_PATHS

驱动器 DRIVE指定配置有I/O的输出缓冲器的输出缓冲器驱动强度&#xff08;mA&#xff09; 支持可编程输出驱动强度的标准。 体系结构支持 所有架构。 适用对象 •端口&#xff08;get_Ports&#xff09; 连接到输出缓冲器的输出或双向端口 价值观 整数值&#xff1a; • 2 • 4…

【UML用户指南】-33-对体系结构建模-系统和模型

目录 1、系统和子系统 2、模型和视图 3、跟踪 4、常用建模技术 4.1、对系统的体系结构建模 4.2、对系统的系统建模 模型是对现实世界的简化——即对系统的抽象&#xff0c;建立模型的目的是为了更好地理解系统。 1、系统和子系统 一个系统可能被分解成一组子系统&#…

09.C2W4.Word Embeddings with Neural Networks

往期文章请点这里 目录 OverviewBasic Word RepresentationsIntegersOne-hot vectors Word EmbeddingsMeaning as vectorsWord embedding vectors Word embedding processWord Embedding MethodsBasic word embedding methodsAdvanced word embedding methods Continuous Bag-…

esp32硬件电路设计

ESP-IDF 入门指南 | 乐鑫科技 (espressif.com) ESP32-DevKitC V4 入门指南 - ESP32 - — ESP-IDF 编程指南 v5.1 文档 (espressif.com)