1、反射技术的应用场景实例
假设我买了一台笔记本电脑,支持插入外界设备,代码如下:
public class NoteBook{
//笔记本是可以运行起来的
public void run(){
System.out.println("note book run");
}
}
创建主程序运行笔记本
public class Main{
public static void main(String args[]){
NoteBook noteBook = new NoteBook();
noteBook.run();
//程序输出:note book run
}
}
由于笔记本支持外接设备,定义一个外界设备的接口
public interface Usb{
void open();
void close();
}
所以在NoteBook类中添加支持Usb的代码,修改后如下:
public calss NoteBook{
//运行功能
public void run(){
System.out.println("note book run");
}
//使用外接USB
public void useUSB(USB usb){
if(usb != null){
usb.open();
usb.close();
}
}
}
所以我们在主函数中传递设备进去就可以了
public class Main{
public static void main(String args[]){
NoteBook noteBook = new NoteBook();
noteBook.run();
//当没有外接设备的时候,传入一个null参数
noteBook.useUSB(null);
}
}
现在插了个鼠标进来了,笔记本使用规则,鼠标实现规则
public class Mouse implements Usb{
void open(){
System.out.println("mouse open");
}
void close(){
System.out.println("mouse close");
}
}
那么在主函数中调用鼠标就可以了,添加代码变成如下:
public class Main{
public static void main(String args[]){
NoteBook noteBook = new NoteBook();
noteBook.run();
//当没有外接设备的时候,传入null参数
noteBook.useUSB(null);
//现在有了鼠标,那么得要添加鼠标的使用
noteBook.useUSB(new Mouse());
}
}
现在问题来了,如果我买了键盘,买了游戏手柄,那是不是每次都得要在主函数Main中去调用一次呢?那么得要修改源代码,有没有什么办法可以一次性解决呢?这时候得要引入反射。
解决办法:
public class NoteBookMain{
public static void main(String args[]){
NoteBook book = new NoteBook();
book.run();
book.useUSB(null);
//因为有了鼠标,所以需要在源程序中,创建鼠标对象并传递给笔记本
//希望后期出现了设备以后,可以不用修改noteBook的代码,还可以不断加入新设备,通过反射完成
//对外提供配置文件
File configFile = new File("usb.properties");
if(!configFile.exists()){
configFile.createNewFile();
}
//读取流和配置文件关联
FileInputStream fis = new FileInputStream(configFile);
Properties prop = new Properties();
//将流中的数据加载到prop
prop.load(file);
for(int x =1; x<=prop.size();x++){
String className = prop.getProperty("usb"+ x);
//对指定的类进行加载
Class calzz = Class.forName(className);
USB usb =(USB) clazz.newInstance();
book.useUSB(usb);
}
fis.close();
}
}
程序可以运行,看到在左侧资源文件中多了一个usb.properties的文件。但是输出内容为空,为什么呢,因为我刚买了笔记本,没有加鼠标。
如果买了鼠标,需要打开usb.properties资源文件,写入加入类的全包名:
usb1 = com.study.Mouse
usb2 = com.study.Key
说明:要写Mouse和Key的全类名,至于为什么是usb1,usb2呢,是因为我们在上边for循环里定义了prop.getProperty("usb"+ x)。