通过案例体会反射的好处
案例:美团外卖---》付款---》要么微信要么支付宝
package com.liu.test01; /** * @author : liu * 日期:08:54:25 * 描述:IntelliJ IDEA * 版本:1.0 */ //接口的指定方:买团外卖 public interface Mtwm { //在线支付功能: void payOnline(); }
package com.liu.test01; /** * @author : liu * 日期:08:55:37 * 描述:IntelliJ IDEA * 版本:1.0 */ public class WeChat implements Mtwm{ @Override public void payOnline() { //具体实现微信支付功能 System.out.println("我已经点了外卖正在使用微信支付"); } }
package com.liu.test01; /** * @author : liu * 日期:08:56:58 * 描述:IntelliJ IDEA * 版本:1.0 */ public class AliPay implements Mtwm{ @Override public void payOnline() { //具体的支付宝支付 System.out.println("我已经点了外卖我正在使用支付宝进行支付"); } }
package com.liu.test01; /** * @author : liu * 日期:09:18:45 * 描述:IntelliJ IDEA * 版本:1.0 */ public class BackCard implements Mtwm{ @Override public void payOnline() { //具体支付 System.out.println("我已经点了外卖我正在使用银行卡进行支付"); } }
测试类
package com.liu.test01; /** * @author : liu * 日期:08:57:52 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Test { //这是一个main方法:是程序的入口 public static void main(String[] args) { //定义一个字符串用来模拟前台的支付方式: String str="招商银行"; if ("微信".equals(str)){//str.equals()????是为了避免空指针异常 //微信支付: //new WeChat().payOnline(); pay(new WeChat()); } if ("支付宝".equals(str)){ //支付宝支付: //new AliPay().payOnline(); pay(new AliPay()); } if ("招商银行".equals(str)){ //招商银行支付: pay(new BackCard()); } }
//微信支付 public static void pay(WeChat wc){ wc.payOnline(); }
//支付宝支付 public static void pay(AliPay aliPay){ aliPay.payOnline(); }
//银行卡支付 public static void pay(BackCard bPay){ bPay.payOnline(); } }
为了提高代码的扩展性---》面向对象特性:多态
package com.liu.test01; /** * @author : liu * 日期:08:57:52 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Test { //这是一个main方法:是程序的入口 public static void main(String[] args) { //定义一个字符串用来模拟前台的支付方式: String str="招商银行"; if ("微信".equals(str)){//str.equals()????是为了避免空指针异常 pay(new WeChat()); } if ("支付宝".equals(str)){ pay(new AliPay()); } if ("招商银行".equals(str)){ pay(new BackCard()); } } //方法的形参是接口,具体传出的事接口类的实现类的对象---》多态的一种形式 public static void pay(Mtwm wc){ wc.payOnline(); } }
多态确实可以提高代码的扩展性,但是:扩展性没有达到最好。
怎么没有达到最好:上面的分支还是需要手动的删除或添加
利用反射石先生上述功能
package com.liu.test01; import java.lang.reflect.Method; /** * @author : liu * 日期:10:34:35 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Demo { //这是一个main方法:是程序的入口 public static void main(String[] args) throws Exception { String str="com.liu.test01.AliPay";//字符串:实际上:是微信类的全限定路径 //下面的代码就是利用反射 Class aClass = Class.forName(str); Object o = aClass.newInstance(); Method payOnline = aClass.getMethod("payOnline"); payOnline.invoke(o); } }
解决办法:反射机制
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本