Java_反射_通过案例理解反射的好处

本文通过一个美团外卖支付的案例,展示了如何利用Java反射机制提高代码的扩展性。原本的代码根据不同的支付方式需要手动添加或删除分支,而通过反射,可以实现动态调用支付接口,无需修改原有代码即可支持新的支付方式,提高了代码的灵活性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x01_通过案例理解反射的好处

反射在实际应用中会被经常运用,包括很多框架的源码。很多人认为这个很难,用了就觉得很厉害。但其实自己会用也不过如此。

这一节0x01通过一个案例来理解反射的好处。

以外卖的实际成绩为例。美团外卖---->付款---->微信还是支付宝?

美团外卖要制定规则,其他的商户(比如支付宝,微信,银行等)遵循规则。在代码中,规则就是接口。

首先定义一个接口:Mtwm
在这里插入图片描述

完善规则:

package com.bones.reflectionTest01;

/**
 * @author : zyy
 * @version : 1.0
 * 接口的指定方:美团外卖
 */
public interface Mtwm {
    //在线支付功能
    void payOnline();
}

然后微信作为想要合作的一方,实现接口Mtwm

public interface Mtwm {
    //在线支付功能
    void payOnline();
}

微信支付:

public class WeChat implements Mtwm{
    @Override
    public void payOnline() {
        //实现微信在线支付的功能
        System.out.println("---微信支付 ## 外卖---");
    }
}

支付宝支付:

public class AliPay implements Mtwm{
    @Override
    public void payOnline() {
        System.out.println("---支付宝支付  ##外卖---");
    }
}

招商银行支付:

public class ZS_BankCard implements Mtwm{
    @Override
    public void payOnline() {
        System.out.println("---招商银行支付 ##外卖---");
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        String str = "微信";
        if ("微信".equals(str)){
            pay(new WeChat());
        }
        if ("支付宝".equals(str)){
            pay(new AliPay());
        }
        if ("招商银行".equals(str)){
            pay(new ZS_BankCard());
        }
    }

    //重载pay方法
    public static void pay(WeChat wc){
        wc.payOnline();
    }
    public static void pay(AliPay ap){
        ap.payOnline();
    }
    public static void pay(ZS_BankCard zb){
        zb.payOnline();
    }
}

上面写的扩展性不好,可以用多态来来写:

public class Test {
    public static void main(String[] args) {
        String str = "微信";
        if ("微信".equals(str)){
            pay(new WeChat());
        }
        if ("支付宝".equals(str)){
            pay(new AliPay());
        }
        if ("招商银行".equals(str)){
            pay(new ZS_BankCard());
        }
    }

    public static void pay(Mtwm m){
        m.payOnline();
    }
}

方法的形参是接口,具体传入的是接口的实现类的对象,这就是多态的一种形式

但是:扩展性没有达到最好。
怎么没有达到最好:上面的分支,还是需要手动的删除或者添加。
解决办法:反射机制
利用反射实现上述功能:

package com.bones.reflectionTest01;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author : zyy
 * @version : 1.0
 * 反射机制-美团外卖支付场景,充分体会反射的好处
 */
public class TestReflection {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
        //从前端接受的,可以传微信,支付宝,招商银行等等
        String str = "com.bones.reflectionTest01.WeChat"; //微信类的全限定路径

        //反射,下面的内容就不用动了,扩展性杠杠滴!
        Class cls = Class.forName(str);
        Object o = cls.newInstance();
        Method method = cls.getMethod("payOnline");
        method.invoke(o);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值