当前位置: 首页 > news >正文

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.mrgr.cn/news/91969.html

相关文章:

  • Codes 开源免费研发项目管理平台 2025年第一个大版本3.0.0 版本发布及创新的轻IPD实现
  • 目标检测数据集-水果腐烂新鲜度检测数据集(适用YOLO全系列)
  • OpenHarmony构建系统-GN与子系统、部件、模块理论与实践
  • (新)01前缀和来临!优点多多!
  • 贪心算法
  • 代码随想录刷题day28|(栈与队列篇:栈)232.用栈实现队列
  • 深搜专题2:组合问题
  • 顺序表和STL——vector【 复习笔记】
  • Deepseek R1 和其他的大模型 共同辅助决策交通出行方案
  • java网络编程
  • Python项目源码34:网页内容提取工具1.0(Tkinter+requests+html2text)
  • QT 基础知识点
  • CLion配置源码阅读工具SourceTrail 阅读GCC
  • Linux基本指令(三)+ 权限
  • pipeline 使用git parameter插件实现动态选择分支构造
  • Windows辉煌的发展历程
  • 数据结构、算法和STL简介 【复习笔记】
  • 【Akashic Records】THE EGG
  • 正确清理C盘空间
  • bind()函数的概念和使用案例