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

embedded/2025/2/26 23:13:55/

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

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/embedded/167382.html

相关文章

三品PDM管理系统:企业产品数据管理的“智慧大脑”,如何破解安全隐私难题?

在数字化转型的浪潮中&#xff0c;企业产品数据已成为核心资产。从设计图纸、工艺文件到供应链信息&#xff0c;海量数据的产生和管理让许多企业陷入“数据沼泽”——信息分散、版本混乱、协作低效&#xff0c;甚至因数据泄露导致商业机密外流。如何高效管理产品全生命周期数据…

音频模拟信号转数字信号的原理

音频模拟信号转数字信号的原理 音频信号是自然界中常见的模拟信号(Analog Signal),它是连续的、随时间变化的波形。为了在计算机或数字设备中处理和存储音频信号,需要将模拟信号转换为数字信号(Digital Signal)。这个过程称为 模数转换(Analog-to-Digital Conversion, …

Day 48 卡玛笔记

这是基于代码随想录的每日打卡 300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,…

微信小程序组件封装与复用:提升开发效率

在前几篇文章中,我们学习了微信小程序的基础知识、数据绑定、事件处理、页面导航与路由以及网络请求与API调用。这些知识帮助我们构建了具备基本功能的小程序。然而,随着项目规模的扩大,代码的复用性和可维护性变得尤为重要。本文将深入探讨微信小程序的组件封装与复用,帮助…

【Java项目】基于Spring Boot的火车订票管理系统

【Java项目】基于Spring Boot的火车订票管理系统 技术简介&#xff1a;采用Spring Boot框架、Java技术、MySQL数据库等实现。 系统简介&#xff1a;火车订票管理系统是一个面向管理员和用户的在线订票平台&#xff0c;主要分为前台和后台两大模块。前台功能模块包括&#xff08…

Spring 原始注解详解与实战指南

&#x1f4dd; 1. 前言 在 Spring 框架的发展过程中&#xff0c;注解的引入大大简化了配置&#xff0c;提升了开发效率 本文将详细介绍 Spring 最初引入的核心注解&#xff0c;包括 Component、Controller、Service、Repository、Autowired、Qualifier 和 Value 等&#xff0c;…

Halcon 3D加快表面匹配速度

文章目录 gen_box_object_model_3d 创建一个代表盒子的 3D 物体模型write_surface_model — 将表面模型写入文件read_surface_model — 将表面模型读取prepare_object_model_3d - 为某个操作准备三维对象模型select_points_object_model_3d - 对 3D 物体模型的属性应用阈值。se…

蓝桥杯之阶段考核

&#x1f4d6; Day 7&#xff1a;阶段考核 - 蓝桥杯官方模拟赛&#xff08;限时 4 小时&#xff09; &#x1f4d6; 一、如何高效完成模拟赛&#xff1f; 模拟赛是一种接近真实竞赛的训练方式。要高效完成模拟赛&#xff0c;需要掌握以下策略&#xff1a; 1. 赛前准备 ✅ 环…