java开发——为什么要使用动态代理?

ops/2025/3/1 15:45:09/

举个例子:假如有一个杀手专杀男的,不杀女的。代码如下:

java">public interface Killer {void kill(String name, String sex);void watch(String name);
}public class ManKiller implements Killer {@Overridepublic void kill(String name, String sex) {if (sex.equals("man")) {System.out.println(name + "已被击杀!");} else {System.out.println(name + "为女性,不杀之!");}}@Overridepublic void watch(String name) {System.out.println(name + "已被监视!");}
}

但是有一个老板雇佣他杀了马冬梅(女),也就是kill("马冬梅", "women");要执行击杀命令!要怎么实现?

可以在击杀之前,原则上把马冬梅当做男的处理,就可以执行击杀命令了!代码如下:

java">public class KillerPrinciple implements InvocationHandler {private Object object;public KillerPrinciple(Object object) {this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {boolean isReward = false;String methodName = method.getName();if(methodName.equals("kill")){boolean isSpecailWomen = false;for (int i = 0; i < args.length; i++) {if(args[i].equals("马冬梅")){isSpecailWomen = true;//马冬梅是特殊女性}}if(isSpecailWomen){for (int i = 0; i < args.length; i++) {if(args[i].equals("women")){args[i] = "man";//直接当做男性处理isReward = true;}}}}//通过java反射机制调用目标代码method.invoke(object, args);if(isReward){System.out.println("老板奖励杀手5000万美金!");}return null;}
}

然后把这个原则告诉这个杀手就可以完成老板交代的任务了!代码如下:

java">public static void main(String[] args) {ManKiller manKiller = new ManKiller();Killer principledKiller = toPrincipledKiller(manKiller);principledKiller.kill("小明", "man");principledKiller.kill("小红", "women");principledKiller.watch("马冬梅");principledKiller.kill("马冬梅", "women");
}
java">private static Killer toPrincipledKiller(ManKiller manKiller) {ClassLoader classLoader = manKiller.getClass().getClassLoader();Class<?>[] interfaces = manKiller.getClass().getInterfaces();KillerPrinciple killerPrinciple = new KillerPrinciple(manKiller);Killer proxy = (Killer) Proxy.newProxyInstance(classLoader, interfaces, killerPrinciple);return proxy;}

输出结果:

小明已被击杀!
小红为女性,不杀之!
马冬梅已被监视!
马冬梅已被击杀!
老板奖励杀手5000万美金!

所以,使用动态代理是为了在不改变目标对象代码的前提下,在目标代码执行前后,可以根据目标方法和参数执行相应的逻辑,以及可以过滤和改变参数的信息。


http://www.ppmy.cn/ops/162265.html

相关文章

Linux的诞生:一场自由与协作的技术革命

Linux的诞生&#xff1a;一场自由与协作的技术革命 在今天的互联网世界&#xff0c;Linux几乎无处不在——从智能手机&#xff08;Android内核&#xff09;到超级计算机&#xff0c;从云计算平台到家用路由器&#xff0c;它的身影渗透在技术的各个角落。但这样一个改变世界的操…

蓝蝶(BlueStacks)模拟器Root、Magisk、LSPosed及Shamiko框架安装与过应用检测指南

蓝蝶&#xff08;BlueStacks&#xff09;模拟器Root、Magisk、LSPosed及Shamiko框架安装与过应用检测指南 蓝蝶bluestacks模拟器root和magisk以及Lsposed和shamiko框架的安装过应用检测 一、引言 蓝蝶&#xff08;BlueStacks&#xff09;模拟器是一款广受欢迎的安卓模拟器&…

winfrom的progressBar 鼠标移上去显示 进度条的时间

需求描述&#xff1a; 播放IPC摄像头&#xff08;海康、大华&#xff09;的录像回放&#xff0c;视频窗口下方有个进度条&#xff0c;能显示当前录像播放的进度&#xff0c;点击进度条能将视频跳转到指定的时间点继续播放... 现在需要再进度条上显示视频的时间&#xff0c;用来…

LeetCode15

LeetCode15 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题目描述 给你一个整数数组 nums&#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k&#xff0c;同时还满足 nums[i] nums[j] nums[k] 0。…

随身wifi wps是什么?(Wi-Fi Protected Setup)一种简化无线网络连接的技术,允许用户无需手动输入密码即可快速连接设备

文章目录 **WPS的核心功能**1. **快速连接方式**&#xff1a;2. **适用场景**&#xff1a; **使用步骤&#xff08;以华为随行WiFi为例&#xff09;****安全风险与建议****支持WPS的设备示例** 好了&#xff0c;让我们解决这个关于便携式 Wi-Fi 设备中 WPS 的问题。首先&#x…

2.8作业

1 /*message.php代码*/访问message.php传参&#xff0c;m&#xff0c;s&#xff0c;f <?php class message{public $tokenadmin; } $m new message(); echo base64_encode(serialize($m)); ?> 2 reserve2 offset flag求原flag 49那里第一遍写错了&#xff08;没有…

Springboot各版本与Java JDK的对应关系及JDK商用版本

Spring Boot各版本对应的 JDK 如下&#xff1a; Spring Boot 2.5.x&#xff1a;-> JDK 16 及以上版本。 Spring Boot 2.4.x&#xff1a;-> JDK 11 及以上版本。 Spring Boot 2.3.x&#xff1a;-> JDK 8 及以上版本&#xff0c;建议使用 JDK 11 及以上版本。 Spring B…

【重磅发布】AllData数据中台核心功能:湖仓一体化平台

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨奥零数据科技官网&#xff1a;…