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服務器的做用:就是處理瀏覽器的請求java
和給予合適的應答,可是瀏覽器的請求類型一般不同,爲了提升服務器的擴展性,一般在Tomcat編寫時就對外提供一個公共的接口--Servlet,要進行怎樣web
的響應和處理請求,須要開發人員須要作的就是直接實現該接口,定義合適的處理方式,並將具體實現類信息寫在配置文件中,Tomcat在操做的時候根據讀取編程
配置文件的內容,動態的得到合適的處理方式,處理瀏覽器的請求,開發者的編程難度也降低,直接面對的是接口和配置文件。想要修改具體的處理方式,直接瀏覽器
修改配置文件的內容便可。服務器