java反射(2) 使用反射生成並且建立物件
阿新 • • 發佈:2018-12-12
- 這是講的是通過配置檔案來建立物件,配置檔案中有鍵值對,程式通過讀取配置檔案中的鍵值對可以創建出具有鍵值對的“字串 - 物件”的物件池,然後就可以通過字串來訪問這些物件。
- 可以使用Class物件(也就是類)的newInstance方法來創建出該類的例項,這個方法的實質通過類的預設構造器來建立物件的。
- 以下為程式碼,具體的講解穿插在程式碼中,配置檔案obj.txt的內容是
a=java.util.Date b=javax.swing.JFrame
// package Chapter_4; import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class ObjectPoolFactory { private Map<String, Object> objectPool = new HashMap<>(); // 定義一個物件池,前面時物件名,後面是實際物件 // 定義一個建立物件的方法,該方法只要傳入一個字串,就可以根據該類名生成java物件 private Object createObject(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException{ // 根據字串獲取對應的java物件 Class<?> clazz = Class.forName(className); return clazz.newInstance(); } // 根據指定的檔案來初始化物件池 // 根據配置檔案來建立物件 public void initPool(String fileName) throws InstantiationException, IllegalAccessException, ClassNotFoundException{ try( FileInputStream fis = new FileInputStream(fileName)) { Properties props = new Properties(); // Properties可以從流中載入或者儲存到流中,以鍵值對的形式處理資料,obj.txt中的資料就是以鍵值對 // 形式儲存的 props.load(fis); // 遍歷檔案中的每個鍵值對,並且以鍵為key,值對應的名字建立新的物件,組成一個map,也可以稱之為物件池 for(String name : props.stringPropertyNames()){ objectPool.put(name, createObject(props.getProperty(name))); } }catch (IOException e){ System.out.println("讀取" + fileName + "異常"); } } public Object getObject(String name){ return objectPool.get(name); // 從objectPool中取出指定的值 } public static void main(String args[]) throws Exception{ // main方法的執行過程是:讀取一個檔案中的鍵值對,接著根據這些鍵值對建立一個物件池,在通過 // 以鍵取值的方式獲得這些物件 ObjectPoolFactory pf = new ObjectPoolFactory(); pf.initPool("obj.txt"); System.out.println(pf.getObject("a")); System.out.println(pf.getObject("b")); } } //執行程式,可以看到下面的輸出結果 // Mon Oct 01 08:38:10 CST 2018 // javax.swing.JFrame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]