1 import java.io.*; 2 import java.util.Properties; 3 4 /*问题描述:存在一个主板--已经定义好,不想修改其代码,还想在主板上面增加一些其他功能? 5 *问题解决方法:主板在定义的时候对外提供一个接口,让其他设备实现该接口,并把这些设备的 6 *信息写在配置文件里面。主板定义的时候读配置文件的信息,动态的获取其他设备的信息,并使用 7 *其他的功能。这样就完全不用修改主板的代码。极大的提高了程序的扩展性。 8 *所以通过反射就可以动态获取扩展类的对象,只需要修改具体配置文件的内容即可。 9 * 10 *反射:动态的获取类的信息。其实是通过类名,加载类,获取类的Class对象,进而做其他的操作。 11 * 使用反射的最大的好处是程序的扩展性大大的提高。 12 *反射涉及的类:Class,java.lang.reflect包里面的Method,Field,Constructor支持 13 * */ 14 public class UseReflection { 15 16 public static void main(String[] args) throws IOException, ClassNotFoundException, Exception { 17 MainBoard mb = new MainBoard(); 18 mb.run(); 19 20 //把添加的设备写在配置文件中,并将该文件封装为对象 21 File f = new File("pci.properties"); 22 //将配置文件关联到流 23 FileInputStream fis = new FileInputStream(f); 24 //创建Properties对象 25 Properties prop = new Properties(); 26 //将流中的信息加载到prop里面 27 prop.load(fis); 28 //遍历从流中得到的信息 29 for(int i = 0; i < prop.size();i++){ 30 String name = prop.getProperty("pci"+(i+1)); 31 Class clazz = Class.forName(name); 32 PCI p = (PCI)clazz.newInstance(); 33 mb.usePCI(p); 34 } 35 36 37 } 38 39 } 40 41 class MainBoard{ 42 public void run(){ 43 System.out.println("mainboard run-------"); 44 } 45 46 public void usePCI(PCI p){ 47 if(p != null){ 48 p.open(); 49 p.close(); 50 } 51 } 52 }
public interface PCI { public void open(); public void close(); } class SoundBoard implements PCI{ public SoundBoard() { } @Override public void open() { System.out.println("open sound"); } @Override public void close() { System.out.println("close sound"); } } class WifiBoard implements PCI{ public WifiBoard() { } @Override public void open() { System.out.println("open wifi"); } @Override public void close() { System.out.println("close wifi"); } }
上面是一种模拟的反射机制的使用,真实使用反射机制的一个比较常见的例子是Tomcat--web服务器,Tomcat服务器的作用:就是处理浏览器的请求
和给予合适的应答,但是浏览器的请求类型通常不一样,为了提高服务器的扩展性,通常在Tomcat编写时就对外提供一个公共的接口--Servlet,要进行怎样
的响应和处理请求,需要开发人员需要做的就是直接实现该接口,定义合适的处理方式,并将具体实现类信息写在配置文件中,Tomcat在操作的时候根据读取
配置文件的内容,动态的获得合适的处理方式,处理浏览器的请求,开发者的编程难度也下降,直接面对的是接口和配置文件。想要修改具体的处理方式,直接
修改配置文件的内容即可。