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

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

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

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

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

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万美金!

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

相关文章:

  • 0222-leetcode-1768.交替合并字符串、389找不同、
  • 异步联邦学习的动态隐私保护框架:重构边缘智能的数据安全边界
  • 采用sidecar模式,将127.0.0.1的请求打到目标机器
  • 网页制作06-html,css,javascript初认识のhtml如何建立超链接
  • Linux: network:driver: rx_crc_errors_phy rx_symbol_err_phy
  • 有哪些开源大数据处理项目使用了大模型
  • vue3父子组件props传值,defineprops怎么用?(组合式)
  • isaac gym使用记录
  • C/C++跳动的爱心
  • [大模型笔记]扣子-知识库搭建,并用Java-SDK调用的笔记
  • centos7的yum出错
  • 大模型在肝硬化风险预测及临床决策中的应用研究
  • 提效10倍:基于Paimon+Dolphin湖仓一体新架构在阿里妈妈品牌业务探索实践
  • Jenkins 自动构建Job
  • idea debug功能演示线程安全问题
  • MATLAB学习之旅:数据建模与仿真应用
  • Autosar Com配置-Timeout配置及实现-基于ETAS工具
  • 解决“error: Tried to call obs_frontend_start_virtualcam with no callbacks!”
  • Tio-Boot 集成 Spring Boot 实现即时通讯功能全解析
  • 运维脚本——9.配置漂移检测
  • 重庆大学通报本科生发14篇SCI论文处理结果
  • 马上评丨全民定制公交,打开城市出行想象空间
  • 2025年4月份CPI环比由降转涨,核心CPI涨幅稳定
  • 工行回应两售出金条疑似有杂质:情况不属实,疑似杂质应为金条售出后的外部附着物
  • 理财经理泄露客户信息案进展:湖南省检受理申诉,证监会交由地方监管局办理
  • AI药企英矽智能第三次递表港交所:去年亏损超1700万美元,收入多数来自对外授权