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在操作的時候根據讀取
配置檔案的内容,動态的獲得合适的處理方式,處理浏覽器的請求,開發者的程式設計難度也下降,直接面對的是接口和配置檔案。想要修改具體的處理方式,直接
修改配置檔案的内容即可。