1. 程式人生 > >java反射(2) 使用反射生成並且建立物件

java反射(2) 使用反射生成並且建立物件

  1. 這是講的是通過配置檔案來建立物件,配置檔案中有鍵值對,程式通過讀取配置檔案中的鍵值對可以創建出具有鍵值對的“字串 - 物件”的物件池,然後就可以通過字串來訪問這些物件。
  2. 可以使用Class物件(也就是類)的newInstance方法來創建出該類的例項,這個方法的實質通過類的預設構造器來建立物件的。
  3. 以下為程式碼,具體的講解穿插在程式碼中,配置檔案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]