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