栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

Java

Java 更新时间:发布时间: 百科书网 趣学号
0x01_通过案例理解反射的好处

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

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

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

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

首先定义一个接口:Mtwm

完善规则:

package com.bones.reflectionTest01;


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;


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

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/957412.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号