反射的应用

源代码封装完成后,通过配置文件对源程序进行扩展

需求:源代码是主板,提供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");
	}
	
}

 配置好后,不用修改主方法,直接运行自己定义的类。

原文地址:https://www.cnblogs.com/lzzhuany/p/4522702.html