反射的最大好处就是可扩展性。。。以下为例子实现。。。
因为如果要添加功能,就不再需要改主函数的代码了,只需改动配置文件即可。。。
package heng.java.reflect.notebook;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class NoteBookMain {
public static void main(String[] args) throws IOException, Exception {
NoteBook book = new NoteBook();
book.run();
//book.useUSB(null);
//对外提供配置文件。
File configFile = new File("usb.properties");
if(!configFile.exists()){
configFile.createNewFile();
}
//读取流和配置文件关联
FileInputStream fis = new FileInputStream(configFile);
Properties prop = new Properties();
prop.load(fis);
for (int i = 1; i <= prop.size(); i++) {
String className = prop.getProperty("usb"+i);
Class clazz = Class.forName(className);
USB usb = (USB)clazz.newInstance();
book.useUSB(usb);
}
}
}
package heng.java.reflect.notebook;
public class NoteBook {
public void run(){
System.out.println("Running");
}
public void useUSB(USB usb){
if(usb != null){
usb.close();
usb.open();
}
}
}
对外接口:
package heng.java.reflect.notebook;
public interface USB {
void close();
void open();
}
功能一:
package heng.java.reflect.notebook;
public class MouseByUSB implements USB{
public void close(){
System.out.println("mouse close");
}
public void open(){
System.out.println("mouse open");
}
}
功能二:
package heng.java.reflect.notebook;
public class KeyByUSB implements USB {
@Override
public void close() {
System.out.println("Key close");
}
@Override
public void open() {
System.out.println("Key open");
}
}
配置文件:
usb1=heng.java.reflect.notebook.MouseByUSB
usb2=heng.java.reflect.notebook.KeyByUSB