反射的应用
源代码封装完成后,通过配置文件对源程序进行扩展
需求:源代码是主板,提供PCI接口进行使用,现在对源代码进行扩充声卡的功能。
接口:PCI
package reflect.test; public interface PCI { void open(); void close(); }
主板运行类:(方法:usePCI进行接收PCI的子类,也就是传入扩展的类。)
package reflect.test; public class MainBoard { public void run(){ System.out.println("main board run..."); } public void usePCI(PCI p){ if(p!=null){ p.open(); p.close(); } } }
主方法:(存在反射的使用,存在方法的调用,存在配置文件的读取等)
package reflect.test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class ReflectTest { public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { MainBoard mb=new MainBoard();//实例化主板对象 mb.run();//进行调用运行方法 File f=new File("pci.properties");//创建配置文件 Properties prop=new Properties();//实例化配置对象 FileInputStream fis=new FileInputStream(f);//字节输入流,进行读取配置文件中的内容 prop.load(fis);//配置对象与输入流进行连接 for(int i=0;i<prop.size();i++){ String pciName=prop.getProperty("pci"+(i+1));//依次得到pci1,pci2...获得内容是的是扩展类的类名 Class cla=Class.forName(pciName);//利用反射获得字节码文件 PCI p=(PCI)cla.newInstance();//利用反射进行实例化 mb.usePCI(p);//调用主板方法中的方法 } fis.close();//关闭输入流。 } }
配置文件(在java项目录中创建 pci.properties ,名称必须与主方法中连接的配置文件名一致)
pci1=reflect.test.SoundCard
自己定义的类(名称必须与配置文件中连接的类名一致,先创建类,在再配置文件中配置,必须实现源代码提供的某个类,本程序中只有PCI一个接口,实现这个接口)
package reflect.test; public class SoundCard implements PCI{ @Override public void open() { System.out.println("sound card open"); } @Override public void close() { System.out.println("sound card close"); } }
配置好后,不用修改主方法,直接运行自己定义的类。