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是新建的文本文件

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

 

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

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

而不用再去修改代码

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


 

你可能感兴趣的:(java)