1. 程式人生 > >類載入機制與反射(二)

類載入機制與反射(二)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class ExtendedObjectPoolFactory {
        //定義一個物件池,前面是物件名,後面是實際物件
        private Map<String, Object> objectPool = new
HashMap<>(); private Properties config = new Properties(); public static void main(String[] args) throws Exception { ExtendedObjectPoolFactory epf = new ExtendedObjectPoolFactory(); epf.init("extObj.txt"); epf.initPool(); epf.initProperty(); System.out.println(epf.getObject(
"a")); } //根據指定檔案來初始化物件池 //根據配置檔案來建立物件 public void initPool() throws Exception { for(String name : config.stringPropertyNames()) { System.out.println("name: " + name); //每取出一個key-value對,如果key中不包含百分號(%)
//表明是根據value來建立一個物件 //呼叫createObject建立物件,並將物件新增到物件池中 if (!name.contains("%")) { objectPool.put(name, createObject(config.getProperty(name))); } } } //根據屬性檔案來呼叫指定物件的setter方法 public void initProperty() throws Exception { for (String name : config.stringPropertyNames()) { //每取出一個key-value對,如果key中包含百分號(%) //即可認為該key用於控制呼叫物件的setter方法設定值 //%前半為物件名字,後半控制setter方法名 if (name.contains("%")) { //將配置檔案中的key按%分割 String[] objAndProp = name.split("%"); //取出呼叫setter方法的引數值 Object target = getObject(objAndProp[0]); //獲取setter方法名:set+"首字母大寫" + 剩下部分 String mtdName = "set" + objAndProp[1].substring(0, 1).toUpperCase() + objAndProp[1].substring(1); //通過target的getClass()獲取他的實現類所對應的Class物件 Class<?> targetClass = target.getClass(); //獲取希望呼叫的setter方法 Method mtd = targetClass.getMethod(mtdName, String.class); System.out.println(mtd); //通過Method的invoke方法執行setter方法 //將config.getProperty(name)的值作為呼叫setter方法的引數 mtd.invoke(target, config.getProperty(name)); } } } public Object getObject(String name) { return objectPool.get(name); } //定義一個建立物件的方法 //該方法只要傳入一個字串類名,程式可以根據該類名生成Java物件 private Object createObject(String clazzName) throws Exception { //根據字串來獲取對應的Class物件 Class<?> clazz = Class.forName(clazzName); //使用clazz對應類的預設構造器建立例項 return clazz.newInstance(); } //從指定屬性檔案中初始化Properties物件 public void init(String fileName) { try (FileInputStream fis = new FileInputStream(fileName)) { config.load(fis); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { System.out.println("讀取" + fileName + "異常"); } } }