1.Java中的反射机制(1),使用class.forName()方法通过类名获得该类的字节码文件

榨汁机-反射-多态-重载实验

1台榨汁机

水果:Apple,Orange,Banana

 

一.最原始情况

1.每个水果一个类,类下一个榨汁方法

2.榨汁机一个类,类下有一个方法,可以调用水果的榨汁方法

代码如下

public static void main(String[] args) {

        Juicer myJuicer=new Juicer();

        myJuicer.run(new Apple());

    }

class Apple{

    public void squeeze(){

        System.out.println("榨出一杯苹果汁");

    }

}

class Orange{

    public void squeeze(){

        System.out.println("榨出一杯橘子汁");

    }

}

class Juicer{

    public void run(Apple a){

        a.squeeze();

    }

}

4.分析问题

如果想从榨苹果换成榨橘子

如果想要从苹果换成橘子,要修改Juicer类下传入的水果

还要修改main函数中传入给Juicer的苹果

也就是需要修改两处代码

使用多态优化后,如下

 

二.多态优化后

1.榨汁机只要管放入榨汁机的是个水果就行,我就榨这个传进来的水果

2.让苹果橘子全都继承水果这个接口,实现榨汁方法就行

3.这样想要从苹果换成橘子,只要修改main函数中传入榨汁机的水果的就行

代码如下

public static void main(String[] args) {

        Juicer myJuicer=new Juicer();

        myJuicer.run(new Orange());

    }


interface Fruit{

    public void squeeze();

}


class Apple implements Fruit{

    public void squeeze(){

        System.out.println("榨出一杯苹果汁");

    }

}


class Orange implements Fruit{

    public void squeeze(){

        System.out.println("榨出一杯橘子汁");

    }

}


class Juicer{

    public void run(Fruit f){

        f.squeeze();

    }

4.问题分析

我们觉得直接修改代码还是不太好,连main函数中的代码都不想修改

具体优化如下第三种方式所示

 

三.用修改配置文件的方法完成榨汁机水果的切换,完全不去修改代码

这个时候,我们需要用到 class.forName("")方法,拿到水果类的字节码文件

再用这个字节码文件新建水果实例

public static void main(String[] args) throws Exception {

    Juicer myJuicer=new Juicer();

    BufferedReader br=new BufferedReader(new FileReader("config.properties"));

    Class clazz=Class.forName(br.readLine());

    myJuicer.run((Fruit)clazz.newInstance());    

    }

这个config.properties是新建的文本文件

 

通过修改配置文件中的类名,直接可以控制榨汁机榨出来的是苹果汁还是橘子汁

而不用再去修改代码

就像把代码看成是一个黑盒,我们只要盯着配置文件修改需求,而不用了解黑盒中的内容


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值