代理

news/2025/10/24 11:57:15/文章来源:https://www.cnblogs.com/jlyyyhwlgsk/p/19162894

代理是一种设计模式
image
StarService.java

package com.itheima.demo4proxy;
// 明星行为接口
public interface StarService {void sing(String name);String dance();
}

Star.java

package com.itheima.demo4proxy;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Star implements StarService{private String name;@Overridepublic void sing(String name) {System.out.println(this.name + "表演唱歌:" + name);}@Overridepublic String dance() {System.out.println(this.name + "表演跳舞:魅力四射!" );return "谢谢!谢谢!";}
}

ProxyUtil

package com.itheima.demo4proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 代理工具类:中介公司,专门负责创建代理对象并返回给别人使用*/
public class ProxyUtil {// 创建一个明星对象的代理对象返回。public static StarService createProxy(Star s){/*** 参数一:用于执行用哪个类加载器去加载生成的代理类。* 参数二:用于指定代理类需要实现的接口: 明星类实现了哪些接口,代理类就实现哪些接口* 参数三:用于指定代理类需要如何去代理(代理要做的事情)。*/StarService proxy = (StarService) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),s.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 用来声明代理对象要干的事情。// 参数一: proxy接收到代理对象本身(暂时用处不大)// 参数二: method代表正在被代理的方法// 参数三: args代表正在被代理的方法的参数String methodName = method.getName();if("sing".equals(methodName)){System.out.println("准备话筒,收钱20万!");}else if("dance".equals(methodName)){System.out.println("准备场地,收钱100万!");}// 真正干活(把真正的明星对象叫过来正式干活)// 找真正的明星对象来执行被代理的行为:method方法Object result = method.invoke(s, args);return result;}});return proxy;}
}

Test.java

package com.itheima.demo4proxy;import java.lang.reflect.Proxy;public class Test {public static void main(String[] args) {// 目标:创建代理对象。// 1、准备一个明星对象:设计明星类。Star star = new Star("章若楠");// 2、为章若楠创建一个专属与她的代理对象。StarService proxy = ProxyUtil.createProxy(star);proxy.sing("《红昭愿》");System.out.println(proxy.dance());}
}

proxy 变量的类型是 StarService 接口,但它指向的是 实现了该接口的动态代理实例。正因为这个实例是接口的实现类,
所以可以调用接口中定义的 sing() 和 dance() 方法,而方法的具体逻辑由动态代理类和 InvocationHandler 共同实现。
这就是动态代理的核心:通过接口生成代理对象,代理对象既遵守接口规范,又能在方法调用前后插入额外逻辑。

image

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

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

相关文章

双碳目标下,MyEMS 为何成为制造企业的 “刚需工具”?

在 “碳达峰、碳中和” 目标全面推进的背景下,制造业作为能源消耗和碳排放的核心领域,正面临前所未有的减排压力与转型挑战。据统计,我国制造业能耗占全国总能耗的 60% 以上,碳排放占比超 50%—— 这意味着,制造业…

树上路径交

树上路径交 计算两条路径的交点数量,直接载入任意 LCA 封装即可。 int intersection(int x, int y, int X, int Y) {vector<int> t = {lca(x, X), lca(x, Y), lca(y, X), lca(y, Y)};sort(t.begin(), t.end());…

10.23总结

include include using namespace std; class DoubleStack { private: int* arr; // 共享的数组int top1; // 栈1的栈顶指针int top2; // 栈2的栈顶指针int size; // 数组的总大小public: /…

关于 vue项目 代理的坑;baseURL必须为空;代理才会生效

/*** 创建 HTTP 请求实例*/ const request = axios.create({baseURL: baseConfig.SERVER_BASE_URL, // 当使用vite代理的时候基础IP设置为空;当axios 配置了baseURL之后;会导致请求直接跳过vite代理timeout: 60000…

点分治 / 树的重心

点分治 / 树的重心 重心的定义:删除树上的某一个点,会得到若干棵子树;删除某点后,得到的最大子树最小,这个点称为重心。我们假设某个点是重心,记录此时最大子树的最小值,遍历完所有点后取最大值即可。重心的性质…

10.21总结

include include using namespace std; struct Student{ int id; string name; int score; }; int main(){ Student student[100]; int n=0; while(cin>>student[n].id>>student[n].name>>student[n…

最近公共祖先 LCA

最近公共祖先 LCA 树链剖分解法 预处理时间复杂度 \(\mathcal O(N)\) ;单次查询 \(\mathcal O(\log N)\) ,常数较小。 struct HLD {int n, idx;vector<vector<int>> ver;vector<int> siz, dep;vec…

题解:P3343 [ZJOI2015] 地震后的幻想乡

题意:给出一个图,无重边自环,边权为 \([0,1]\) 内的随机数,问最小生成树最大边权的期望。 做法: 注意到题目中有一个 hint:\(m\) 个随机变量的 \(k\) 小值期望是 \(\frac{k}{m+1}\),考虑怎么使用。 考虑暴力,因…

暂存:P14214 [COI 2010] 圆圈 / KOLO

\(\mathcal {P14214\ \ [COI 2010]\ \ 圆圈 \ \ /\ \ KOLO}\) #include<bits/stdc++.h> using namespace std;const int N=5e6+10; int pre[N],nxt[N]; int n,k,a; vector<int>p; const int M=1e7;//5e5…

树论大封装(直径+重心+中心)

树论大封装(直径+重心+中心) struct Tree {int n;vector<vector<pair<int, int>>> e;vector<int> dep, parent, maxdep, d1, d2, s1, s2, up;Tree(int n) {this->n = n;e.resize(n + 1);…

QMPlayer2解析

编译好我们就可以解析QMPlayer2,直接debug运行代码。 首先先看一下懒汉单例模式的QMPlay2GUIClass,宏定义了一个QMPlay2GUI #define QMPlay2GUI \QMPlay2GUIClass::instance()单例模式 QMPlay2GUIClass &qmplay2G…

2025年10月广州单位办公室搬家公司全景解析报告,基于专业测评的技术、性能及市场优势深度分析

在现代化城市运营体系中,单位办公室搬迁是一项涉及空间规划、设备保护、数据安全及效率管理的系统性工程。据2025年最新行业调研数据显示,广州企事业单位搬迁市场需求量年均增长12%,其中超80% 的单位将"专业资…

书评-谋杀黄昏

看了这么多小说,很少有像这本一样,让我流泪的,让我迫切地想要写写自己的感触的。 林思弦和陈寄原本互相厌恶,却阴差阳错,在平淡的相处中互生好感。但林思弦自知先前行径有多恶劣,又因陈寄对其他和他性格截然不同…

徐州信息技术服务管理体系认证渠道口碑榜:聚焦机构资质、服务案例及合规性评估

随着企业数字化转型加速,信息技术服务管理体系认证(ISO/IEC 20000-1)已成为衡量服务机构核心竞争力的关键指标。据行业统计,2024年徐州地区认证需求同比增长23.7%,企业对认证机构的资质完备性、本地化服务能力及合…

完整教程:【汽车篇】AI深度学习在汽车零部件外观检测——铝铸件中的应用

完整教程:【汽车篇】AI深度学习在汽车零部件外观检测——铝铸件中的应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

附加数据文件失败:操作系统错误 5:“5(拒绝访问。)”。 CREATE DATABASE 失败。无法创建列出的某些文件名

错误: 无法打开物理文件“D:\MSSQLDATA\K3DBConfiger2022814305192_Data.mdf”。操作系统错误 5:“5(拒绝访问。)”。CREATE DATABASE 失败。无法创建列出的某些文件名。请查看相关错误。 (Microsoft SQL Server,错误…

20251024- 使用shell脚本分库定时备份MySQL数据

#!/bin/bash# 注意mysql和mysqldump命令使用绝对路径# mkdir -p /data/backup_mysql # touch /data/backup_mysql/backup_mysql.loghost="127.0.0.1" port="3306" user="root" password…

权威调研榜单:东莞工厂装修公司OP3榜单好评深度解析

2025年东莞工厂装修公司权威推荐榜:聚焦专业资质、施工规模及服务案例的深度解析 工厂装修作为工业建筑领域的重要组成部分,其专业性直接关系到生产环境的安全性与运营效率。随着制造业升级需求的不断提升,装修公司…

【Linux】倒计时和进度条完成

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年口碑好的FPC离型纸,环氧胶离型纸推荐TOP生产厂家

2025年口碑好的FPC离型纸,环氧胶离型纸推荐TOP生产厂家行业概述FPC离型纸和环氧胶离型纸作为柔性电路板(FPC)制造过程中的关键材料,其质量直接影响最终产品的性能和良率。随着5G、物联网、可穿戴设备等新兴技术的快速…