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

news/2025/2/23 15:05:28

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

java">public interface Killer {
    void kill(String name, String sex);
    void watch(String name);
}

public class ManKiller implements Killer {

    @Override
    public void kill(String name, String sex) {
        if (sex.equals("man")) {
            System.out.println(name + "已被击杀!");
        } else {
            System.out.println(name + "为女性,不杀之!");
        }
    }

    @Override
    public 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;
    }

    @Override
    public 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.niftyadmin.cn/n/5863507.html

相关文章

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

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

运维脚本——9.配置漂移检测

场景&#xff1a;检测服务器配置与基准配置的差异&#xff0c;防止未经授权的修改。 示例&#xff1a;使用Ansible Playbook对比当前配置与标准模板。 - hosts: alltasks:- name: Check SSH configuration against baselineansible.builtin.diff:path: /etc/ssh/sshd_configori…

【Alertmanager】alertmanager告警多种通知方式--企业微信告警、钉钉告警、电话和短信告警

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

格行物联网代理项目技术解析:三网切换与AI识别如何赋能轻资产创业?格行随身WiFi和视精灵代理靠谱吗?格行乡村万店计划可行性深度分析!低成本的小生意有哪些?

一、市场可行性 市场需求基础 当前移动网络需求呈现多样化特征&#xff0c;覆盖短租客、物流从业者、户外直播等群体&#xff0c;且5G技术普及加速了物联网设备的应用场景扩展。同时&#xff0c;智能安防领域因家庭与商业场景需求增长&#xff0c;双目摄像头及AI识别技术的应用…

边缘安全加速(ESA)套餐

为帮助不同规模和需求的企业选择合适的解决方案&#xff0c;边缘安全加速&#xff08;ESA&#xff09;提供了多种套餐。以下是四种主要套餐的介绍&#xff0c;每个套餐都根据企业需求提供不同的功能和服务水平&#xff0c;从基础安全保护到企业级的全面防护与加速。 1. 各版本详…

Git常见命令--助力开发

git常见命令&#xff1a; 创建初始化仓库&#xff1a; git 将文件提交到暂存区 git add 文件名 将文件提交到工作区 git commit -m "注释&#xff08;例如这是发行的版本1&#xff09;" 文件名 查看状态 如果暂存区没有文件被提交显示&#xff1a; $ git status On…

cs106x-lecture14(Autumn 2017)-SPL实现

打卡cs106x(Autumn 2017)-lecture14 (以下皆使用SPL实现&#xff0c;非STL库&#xff0c;后续课程结束会使用STL实现) 1、min Write a function named min that accepts a pointer to a ListNode representing the front of a linked list. Your function should return the …

基于ffmpeg+openGL ES实现的视频编辑工具-添加转场(九)

在视频编辑的广阔领域中,转场效果无疑是提升视频流畅性与观赏性的关键要素。巧妙运用转场,能够让不同视频片段之间的衔接更为自然,同时赋予视频独特的创意魅力。本文将深入探讨如何借助 ffmpeg 和 openGL ES 技术,在视频编辑工具中实现丰富多样的转场效果。 一、转场技术原…