反射使用,也是反射的应用场景

版权声明:不要随便复制~~ 技术更新有些东西也会相应更新 https://blog.csdn.net/chuxin_mm/article/details/86507928

先说一个场景:  电脑运行的场景 , 我写简单明了一点!!

1. 想象电脑开始运行就是执行main方法,就开始运行了。

public static void main (String[] args){
    // 模拟启动电脑的过程
    主板 主板1 = new 主板();
    主板1.主板运行();
}
2. 想象主板开始运行的类(注意:主板上可以加声卡,网卡,显卡,内存条等很多功能,这一点很重要。)
public class 主板 {
    public void 主板运行(){

    }

    public void 主板关机(){

    }
}
现在不同了, 我电脑开机后,我又想上网,听音乐了。怎么办呢 ?
接着就是加代码,改代码呗。对吧。 我现在想上网,听音乐。好,创建2个类,分别是上网,听音乐。

3. 想象开始上网的类;
public class 网卡 {
    public void 网卡运行开始上网(){

    }
    public void 网卡关机停止上网(){

    }
}

4. 想象开始听音乐的类;
public class 声卡 {
    public void 声卡运行听音乐(){

    }
    public void 声卡关机静音了(){

    }
}
既然想要上网听音乐,那么就要开始改主板的代码了。 给主板加功能。

public class 主板 {
    public void 主板运行(){
        
    }

    public void 主板关机(){

    }

    public void 网卡(status s) {
        if(s==1){
            网卡 网卡1 = new 网卡();
            网卡1.网卡运行开始上网();
        }else {
            网卡 网卡1 = new 网卡();
            网卡1.网卡关机停止上网();
        }
    }

    public void 声卡(status s) {
        if(s==1){
            声卡 声卡1 = new 声卡();
            声卡1.声卡运行听音乐();
        }else {
            声卡 声卡1 = new 声卡();
            声卡1.声卡关机静音了();
        }
    }

}

最后,我们运行电脑程序即可让电脑能开机,上网,听音乐
public static void main (String[] args){
    // 模拟启动电脑的过程
    主板 主板1 = new 主板();
    主板1.主板运行();
    主板1.网卡(1);
    主板1.声卡(1);
}

接下来,就是解决上面遇到的问题(耦合度太高):

写到现在,大家发现问题了没有 ? 主板上可以添加功能。但是功能有成千上万个。
是不是每次给主板加功能,换功能的时候都要重写编写代码呢 ? 太麻烦了。这是一个很大的问题,耦合度太高。

接着,我想到了一个方法。我自己对外创建一个接口。
名字叫: 外设部件互连标准,作用是无论添加什么功能,这个功能要么开启要么关闭

public interface 外设部件互连标准 {
    public void open();
    public void close();
}
这时候我就不管电脑要加哪些功能了。
我们先给电脑创建2个功能。声卡、网卡

添加声卡功能:
public class 声卡 implements 外设部件互连标准 {
   public void open(){
	System.out.println("声卡运行听音乐");
   }
   public void close(){
	System.out.println("声卡关机静音了");
   }
}

添加网卡功能:
public class 网卡 implements 外设部件互连标准 {
   public void open(){
	System.out.println("网卡运行开始上网");
   }
   public void close(){
	System.out.println("网卡关机停止上网");
   }
}

编写同意运行电脑功能的类:
编写主板功能:
public class 主板 {
   这里的电脑主板的开关机,也可以用下面的接口,这里就不这么写了。
   public void open(){
	System.out.println("电脑开机");
   }
   public void close(){
	System.out.println("电脑关机");
   }
   public void 使用电脑其他功能(外设部件互连标准 标准){
        if(标准!=null){
            标准.open();
        }else {
            标准.close();
        }
   }
}


下面就是使用功能:
public static void main (String[] args){
    // 模拟启动电脑的过程
    主板 主板1 = new 主板();
    主板1.主板运行();
    // 使用声卡功能
    外设部件互连标准 声卡1 = new 声卡();
    声卡1.open();
    // 使用网卡功能
    外设部件互连标准 网卡1 = new 网卡();
    网卡1.open();
}

 问题又来了,我再使用功能的时候,每次都要new 具体的功能对象啊。如果有成千上万的功能,又怎么办 ? 改代码 ?

这时候,就用到了反射。
反射来了哈,前面这么多铺垫不容易呀。
我现在要做的就是,我只加功能,不改以前的代码。
以前是怎么调用,就怎么调用,也不主动new对象当参数传。并且我只管写我的 内存条 功能。以前的代码不变。

在说简单点,就是代码里只加一个类即可:
public class 内存条 implements 外设部件互连标准 {
   public void open(){
	System.out.println("内存开始运行");
   }
   public void close(){
	System.out.println("关闭内存功能");
   }
}

怎么来完成这个需求呢 ?

我把步骤写完整:

1. 创建标准接口类
public interface 外设部件互连标准 {
    public void open();
    public void close();
}

2. 创建电脑功能类(这里的类,可以随便加了,只要实现上面的接口,并且在配置文件中配置即可)
添加主板功能:
public class 主板 implements 外设部件互连标准 {
   public void open(){
	System.out.println("电脑开机");
   }
   public void close(){
	System.out.println("电脑关机");
   }
}

添加声卡功能:
public class 声卡 implements 外设部件互连标准 {
   public void open(){
	System.out.println("声卡运行听音乐");
   }
   public void close(){
	System.out.println("声卡关机静音了");
   }
}

添加网卡功能:
public class 网卡 implements 外设部件互连标准 {
   public void open(){
	System.out.println("网卡运行开始上网");
   }
   public void close(){
	System.out.println("网卡关机停止上网");
   }
}

添加内存条功能:
public class 内存条 implements 外设部件互连标准 {
   public void open(){
	System.out.println("内存开始运行");
   }
   public void close(){
	System.out.println("关闭内存功能");
   }
}

3. 编写配置文件  例如:pci.properties 内容为:
声卡地址=com.wqm.声卡
网卡地址=com.wqm.网卡
内存条地址=com.wqm.内存条

4.编写功能是否运行的判断类:
编写主板功能:
public class 运行电脑 {
   public void 使用电脑功能(外设部件互连标准 标准){
        if(标准!=null){
            标准.open();
        }else {
            标准.close();
        }
   }
}

5. 编写启动类,一次编写 以后就不用再编写,修改了,只需要编写配置文件。
当然这里的功能,写的漏洞百出。但就是这么个意思。
public static void main(String[] args) {
    运行电脑 运行电脑1 = new 运行电脑();
    
    File configFile = new File("pci.properties");
    Properties prop = new Properties();
    FileInputStream fis = new FileInputStream(configFile);
	prop.load(fis);

   for(int x=0; x<prop.size(); x++){
       String pciName = prop.getProperty("获取配置文件中的地址值");
       Class clazz = Class.forName(pciName);//用Class去加载这个pci子类。 
       // 使用反射创建对象,调用方法
       外设部件互连标准 标准 = (外设部件互连标准)clazz.newInstance();
       运行电脑1.使用电脑功能(标准);
   }
   fis.close();
}

完工 !!! 
具体的场景要自己慢慢领会。

猜你喜欢

转载自blog.csdn.net/chuxin_mm/article/details/86507928
今日推荐