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");要执行击杀命令!要怎么实现?

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

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;}
}

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

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");
}
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.mzph.cn/diannao/70605.shtml

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

相关文章

Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读

前言 在自然语言处理领域&#xff0c;随着大语言模型&#xff08;LLMs&#xff09;不断拓展其阅读、理解和生成文本的能力&#xff0c;如何高效处理长文本成为一项关键挑战。近日&#xff0c;Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混…

Linux中的查看命令

路径分为相对路径&#xff08;行相对当前工作目录开始的路径&#xff09;和绝对路径&#xff08;不管是&#xff09;#&#xff1a;命令提示符&#xff0c;从这个位置可以开始输入命令&#xff0c;另一个提示符为$&#xff0c;如果是root&#xff0c;则提示为#&#xff1b;如果是…

如何用校园内网远程连接服务器

注&#xff1a;本机家庭版windows11&#xff0c;要连接校园网&#xff0c;windows10/11一般都内置openssh&#xff0c;找到后安装&#xff0c;被连服务器是linux 一、先查看是否安装openssh&#xff0c;没有的话安装 方法一&#xff1a; -> 1.1 按下winR按键&#xff0c;…

AI客服-接入deepseek大模型到微信(本地部署deepseek集成微信自动收发消息)

1.本地部署 1.1 ollama Ollama软件通过其高度优化的推理引擎和先进的内存管理机制&#xff0c;显著提升了大型语言模型在本地设备上的运行效率。其核心采用了量化技术&#xff08;Quantization&#xff09;以降低模型的计算复杂度和存储需求&#xff0c;同时结合张量并行计算&…

使用 Docker-compose 部署 MySQL

使用 Docker Compose 部署 MySQL 本文将详细指导如何使用 docker-compose 部署 MySQL&#xff0c;包括基本配置、启动步骤、数据持久化以及一些高级选项。通过容器化部署 MySQL&#xff0c;你可以快速搭建一个隔离的数据库环境&#xff0c;适用于开发、测试或小型生产场景。 关…

HTML 中的 Canvas 样式设置全解

在 HTML5 中&#xff0c;<canvas> 元素提供了一个强大的绘图接口&#xff0c;允许开发者通过 JavaScript 实现各种图形和动画效果。为了充分利用 <canvas> 的功能&#xff0c;理解其样式设置是至关重要的。本文将详细介绍如何在 HTML 中设置 <canvas> 的各种…

【论文解析】Fast prediction mode selection and CU partition for HEVC intra coding

级别:IET Image Processing(2020)CCF CSCI 4区时间:2020年机构:苏州大学下载地址:Fast prediction mode selection and CU partition for HEVC intra coding摘要 HEVC确实是一个很大的进步,编码效率翻倍,但计算复杂度也增加了不少。为了解决这个问题,提出了两种算法:…

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2)

Paimon的下载及安装&#xff0c;并且了解了主键表的引擎以及changelog-producer的含义参考&#xff1a; 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join&#xff0c;集成mysql cdc等参考&#xff1a; 大数据组件(四)快速入门实时数据…

智慧校园系统在学生学习与生活中的应用

随着科技的快速发展&#xff0c;智慧校园系统逐渐成为现代教育不可或缺的一部分。它整合了先进的信息技术、物联网技术以及人工智能等&#xff0c;旨在构建一个全面、智能、个性化的学习与生活环境。对于学生而言&#xff0c;这一系统不仅能够极大地提高学习效率&#xff0c;还…

基于Flask的京东商品信息可视化分析系统的设计与实现

【Flask】基于Flask的京东商品信息可视化分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 系统能够灵活地执行SQL查询&#xff0c;提取出用于分析的关键数据指标。为了将这…

Electron通过ffi-napi调用dll导出接口

electron使用ffi-napi环境搭建 附打包好的ffi-napi可以直接放到项目目录下使用&#xff0c;避免以后麻烦 一、安装node.js Node.js官网&#xff1a;https://nodejs.org/zh-cn/download&#xff0c;选择LTS长期稳定版本即可 需要注意Node.js 区分32和64位&#xff0c;32位版…

25工程管理研究生复试面试问题汇总 工程管理专业知识问题很全! 工程管理复试全流程攻略 工程管理考研复试真题汇总

工程管理复试面试心里没底&#xff1f;别慌&#xff01;学姐手把手教你怎么应对复试&#xff01; 很多同学面对复试总担心踩坑&#xff0c;其实只要避开雷区掌握核心技巧&#xff0c;逆袭上岸完全有可能&#xff01;这份保姆级指南帮你快速锁定重点&#xff0c;时间紧迫优先背…

深蓝学院自主泊车第3次作业-IPM

目录 1 题目介绍2 求解 1 题目介绍 已知鱼眼相机的参数&#xff0c; image_width&#xff0c;表示图像的宽度image_height&#xff0c;表示图像的高度 ξ \xi ξ&#xff0c;表示鱼眼相机参数 k 1 k_1 k1​、 k 2 k_2 k2​&#xff0c;表示径向相机参数 p 1 p_1 p1​、 p 2 p…

核货宝助力连锁门店订货数字化转型升级

在竞争激烈的连锁零售行业&#xff0c;传统订货模式弊端日益凸显&#xff0c;严重制约着企业的发展。核货宝订货系统以其卓越的数字化解决方案&#xff0c;为连锁门店订货带来了全方位的变革&#xff0c;助力企业实现数字化转型升级&#xff0c;在市场中抢占先机。 一、增强总部…

2.最多提取子串数目(100分)-附带Java逐行解析

题目 给定 [a-z]&#xff0c;26个英文字母小写字符串组成的字符串 A 和 B&#xff0c;其中 A 可能存在重复字母&#xff0c;B 不会存在重复字母&#xff0c;现从字符串 A 中按规则挑选一些字母&#xff0c;可以组成字符串B。 挑选规则如下&#xff1a; 同一个位置的字母只能挑…

AutoGen 技术博客系列 八:深入剖析 Swarm—— 智能体协作的新范式

本系列博文在掘金同步发布, 更多优质文章&#xff0c;请关注本人掘金账号&#xff1a; 人肉推土机的掘金账号 AutoGen系列一&#xff1a;基础介绍与入门教程 AutoGen系列二&#xff1a;深入自定义智能体 AutoGen系列三&#xff1a;内置智能体的应用与实战 AutoGen系列四&am…

力扣每日一题【算法学习day.132】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#xff01;&#xff01;&#xff01; 习题 1.统计相似字符串对的数目 题目链…

C语言.h头文件的写法

头文件的内容 #ifndef __SEQUENCE_LIST_H // 定义以防止递归包含 #define __SEQUENCE_LIST_H // (1)、其它头文件 #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <stdbool.h> // (2)、宏定义(函数、变量、常量) // (3)、…

Spring AI + Ollama 实现调用DeepSeek-R1模型API

一、前言 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型&#xff0c;凭借其强大的自然语言处理能力和丰富的知识储备&#xff0c;迅速成为业界关注的焦点。无论是文本生…

自学Java-AI结合GUI开发一个石头迷阵的游戏

自学Java-AI结合GUI开发一个石头迷阵的游戏 准备环节1、创建石头迷阵的界面2、打乱顺序3、控制上下左右移动4、判断是否通关5、统计移动步骤&#xff0c;重启游戏6、拓展问题 准备环节 技术&#xff1a; 1、GUI界面编程 2、二维数组 3、程序流程控制 4、面向对象编程 ∙ \bulle…