Java反射

案例一:美团与支付平台合作

美团可以选择不同的支付平台,每次只能选一个

解决方法1:使用分支实现.

问题:当有新的支付商出现,或者有些支付方不再合作时,必须修改分支。

【美团接口】

package com.msb.meituan;
/*
*案例说明,在美团外卖,要实现微信或支付宝支付
* 1.美团外卖要制定接口:在线支付
* 2.微信、支付宝实现接口
* */
public interface Mtwm {
    //在线支付功能
    void payOnline();
}

【AliPay 类】

package com.msb.meituan;

public class AliPay implements Mtwm {
    @Override
    public void payOnline() {
        System.out.println("我已经点了外卖,正在使用支付宝支付");
    }
}

【WeChat 类】

package com.msb.meituan;

public class WeChat implements Mtwm {
    @Override
    public void payOnline() {
        //具体实现微信支付的功能
        System.out.println("我已经点了外卖,正在使用微信支付");
    }
}

【测试类】

package meituan2;

public class Test {
    public static void main(String[] args) {
        //定义字符串,用来模拟前台的支付方式
        String str = "微信";
        switch(str){
            case "微信":
                pay(new WeChat());//调用微信支付new WeChat().payOnline()
                break;
            case "支付宝":
                //new AliPay().payOnline();//调用阿里支付
                pay(new AliPay());
                break;
            default:
                System.out.println("无法支付");
                break;
        }
    }
  /*  //微信支付
    public static void pay(WeChat wc){
        wc.payOnline();
    }
    //支付宝支付
    public static void pay(AliPay ap){
        ap.payOnline();
    }*/

    //多态提高代码扩展性
    public static void pay(Mtwm mt){
        mt.payOnline();
    }
}

解决方法2:使用反射实现.

【测试类】

package meituan2;

import java.lang.reflect.Method;

public class Test1 {
    public static void main(String[] args) throws Exception {
        //定义一个字符串,用来模拟前台的支付方式
        String str = "meituan2.WeChat";//微信类的全限定路径
        //反射,下面的代码,在以后增加、减少支付方式时候,不需要再修改。
        Class cls = Class.forName(str);
        Object o = cls.newInstance();
        Method method = cls.getMethod("payOnline");
        method.invoke(o);
    }
}

二、反射概念

在运行状态下,获取类的所有属性和方法信息,调用对象的任意方法和属性。
这种动态获取信息、动态调用方对象方法的功能称为java语言的反射机制。

三、获取类的字节码信息

package com.msb.reflecttest;


public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取Person类的字节码信息,目的是使用对象的方法,当有对象了,就不用获取字节码了。
        // 有四种方式
        //1.不常用
        Person p = new Person();
        Class c1 = p.getClass();
        System.out.println(c1);//class com.msb.reflecttest.Person

        //2.不常用
        Class c2 = Person.class;
        System.out.println(c2);

        //3.Class.forName
        Class c3 = Class.forName("com.msb.reflecttest.Person");
        System.out.println(c3);

        //4.类的加载器
        ClassLoader loader = Test.class.getClassLoader();
        Class c4 = loader.loadClass("com.msb.reflecttest.Person");
        System.out.println(c4);

    }
}

四、class类

class类的具体实例:
(1)类
(2)接口
(3)注解
(4)数组
(5)基本数据类型
(6)void

package com.msb.reflecttest;
public class Test {
    public static void main(String[] args) throws ClassNotFoundException {        
       Class c5 = Person.class;
       Class c6 = Comparable.class;
       Class c7 = Override.class;
       int[] a = {1,2,3};
       int[] b = {4,5,6};
        Class c8 = a.getClass();
        Class c9 = b.getClass();
        System.out.println(c8==c9);//true
        Class c10 = int.class;
        Class c11 = void.class;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值