JFig讀取配置文件,實現動態加載

size=small]      通過JFig.jar可以實現讀取配置文件,把數據保存到集合中,然後通過代理就可以實現動態加載了.
Collection類

Java代碼
  1. /**  
  2.  * @author 42087743  
  3.  * 功能:讀取配置文件,將數據存儲到hashmap中  
  4.  * 說明:爲節約版面,省去了set和get方法  
  5.  */   
  6. public   class  CollectionConfig {  
  7.     //設置xml文件中的name   
  8.     private   final   static  String Config_Section =  "collection" ;  
  9.     //聲明存儲數據的hashmap   
  10.     private   static  Map<String,String> hashMap =  null ;  
  11.     //主要方法,通過JFig讀取配置文件   
  12.     public   static  Map load(String config_File){  
  13.         JFigLocator jFigLocator = new  JFigLocator(config_File);  
  14.         JFigIF jFigIF = JFig.getInstance(jFigLocator);  
  15.         hashMap = new  HashMap<String,String>();  
  16.           
  17.         //存儲數據到properties中   
  18.         Properties props = jFigIF.getSectionAsProperties(Config_Section);  
  19.         Enumeration enumeration = props.keys();  
  20.         //迭代數據存儲到hashmap中   
  21.         while (enumeration.hasMoreElements()){  
  22.             String key = (String) enumeration.nextElement();  
  23.             String value = (String) props.get(key);  
  24.             hashMap.put(key, value);  
  25.         }  
  26.         return  hashMap;  
  27.     }  
  28. }  
/**
 * @author 42087743
 * 功能:讀取配置文件,將數據存儲到hashmap中
 * 說明:爲節約版面,省去了set和get方法
 */
public class CollectionConfig {
	//設置xml文件中的name
	private final static String Config_Section = "collection";
	//聲明存儲數據的hashmap
	private static Map<String,String> hashMap = null;
	//主要方法,通過JFig讀取配置文件
	public static Map load(String config_File){
		JFigLocator jFigLocator = new JFigLocator(config_File);
		JFigIF jFigIF = JFig.getInstance(jFigLocator);
		hashMap = new HashMap<String,String>();
		
		//存儲數據到properties中
		Properties props = jFigIF.getSectionAsProperties(Config_Section);
		Enumeration enumeration = props.keys();
		//迭代數據存儲到hashmap中
		while(enumeration.hasMoreElements()){
			String key = (String) enumeration.nextElement();
			String value = (String) props.get(key);
			hashMap.put(key, value);
		}
		return hashMap;
	}
}



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Proxy類

Java代碼
  1. /**  
  2.  * @author 42087743   
  3.  * 功能:代理,爲用戶屏蔽內部代碼,方便用戶得到實例  
  4.  */   
  5. public   class  Proxy {  
  6.     // 創建對象hashmap,得到讀取配置文件的hashmap   
  7.     private   static  Map hashMap = CollectionConfig.getHashMap();  
  8.   
  9.     // 用戶輸入key,返回給用戶value   
  10.     public   static  Object getInstance(String key)  throws  ClassNotFoundException {  
  11.         Object value = null ;  
  12.         value = Class.forName(hashMap.get(key).toString());  
  13.         return  value;  
  14.     }  
  15. }  
/**
 * @author 42087743 
 * 功能:代理,爲用戶屏蔽內部代碼,方便用戶得到實例
 */
public class Proxy {
	// 創建對象hashmap,得到讀取配置文件的hashmap
	private static Map hashMap = CollectionConfig.getHashMap();

	// 用戶輸入key,返回給用戶value
	public static Object getInstance(String key) throws ClassNotFoundException {
		Object value = null;
		value = Class.forName(hashMap.get(key).toString());
		return value;
	}
}



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config.xml

Java代碼
  1. <?xml version= "1.0"  encoding= "utf-8" ?>  
  2. <CONFIGURATION>  
  3.     <section name="collection" >  
  4.         <entry key="java.util.List"  value= "java.util.ArrayList"  />  
  5.         <entry key="java.util.Set"  value= "java.util.HashSet"  />  
  6.         <entry key="java.util.Map"  value= "java.util.HashMap"  />  
  7.     </section>  
  8. </CONFIGURATION>  
<?xml version="1.0" encoding="utf-8"?>
<CONFIGURATION>
	<section name="collection">
		<entry key="java.util.List" value="java.util.ArrayList" />
		<entry key="java.util.Set" value="java.util.HashSet" />
		<entry key="java.util.Map" value="java.util.HashMap" />
	</section>
</CONFIGURATION>



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test類

Java代碼
  1. /**  
  2.  * @author 42087743   
  3.  * 功能:測試,讀取指定的配置文件,動態加載它,最後運行它的方法  
  4.  */   
  5. public   class  Test {  
  6.     public   static   void  main(String[] args)  throws  ClassNotFoundException,  
  7.             InstantiationException, IllegalAccessException,  
  8.             IllegalArgumentException, InvocationTargetException {  
  9.         String key = "java.util.Map" ;  
  10.         // 讀取配置文件   
  11.         CollectionConfig.load("com/jfig/config.xml" );  
  12.         // 加載類   
  13.         Class o = (Class) Proxy.getInstance(key);  
  14.         // 獲得實例   
  15.         Object ob = o.newInstance();  
  16.         // 得到方法數組   
  17.         Method[] method = o.getMethods();  
  18.         // 迭代,匹配方法名,最後調用該方法   
  19.         for  ( int  i =  0 ; i < method.length; i++) {  
  20.             // 將==先進行比較,可以改善性能,因爲==比equals速度快   
  21.             if  ( "put"  == method[i].getName()  
  22.                     || "put" .equals(method[i].getName())) {  
  23.                 // 將所有方法名放到集合中去   
  24.                 for  ( int  j =  0 ; j < method.length; j++) {  
  25.                     method[i].invoke(ob,  
  26.                             new  Object[] { j, method[j].toString() });  
  27.                 }  
  28.                 // 直接跳出循環,無須繼續循環下去   
  29.                 break ;  
  30.             }  
  31.         }  
  32.         for  ( int  i =  0 ; i < method.length; i++) {  
  33.             if  ( "size"  == method[i].getName()  
  34.                     || "size" .equals(method[i].getName())) {  
  35.                 System.out.println("集合的大小是:"  + method[i].invoke(ob));  
  36.                 break ;  
  37.             }  
  38.         }  
  39.     }  
  40. }  
/**
 * @author 42087743 
 * 功能:測試,讀取指定的配置文件,動態加載它,最後運行它的方法
 */
public class Test {
	public static void main(String[] args) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException,
			IllegalArgumentException, InvocationTargetException {
		String key = "java.util.Map";
		// 讀取配置文件
		CollectionConfig.load("com/jfig/config.xml");
		// 加載類
		Class o = (Class) Proxy.getInstance(key);
		// 獲得實例
		Object ob = o.newInstance();
		// 得到方法數組
		Method[] method = o.getMethods();
		// 迭代,匹配方法名,最後調用該方法
		for (int i = 0; i < method.length; i++) {
			// 將==先進行比較,可以改善性能,因爲==比equals速度快
			if ("put" == method[i].getName()
					|| "put".equals(method[i].getName())) {
				// 將所有方法名放到集合中去
				for (int j = 0; j < method.length; j++) {
					method[i].invoke(ob,
							new Object[] { j, method[j].toString() });
				}
				// 直接跳出循環,無須繼續循環下去
				break;
			}
		}
		for (int i = 0; i < method.length; i++) {
			if ("size" == method[i].getName()
					|| "size".equals(method[i].getName())) {
				System.out.println("集合的大小是:" + method[i].invoke(ob));
				break;
			}
		}
	}
}



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;後來想拓展下,進 而實現spring的IOP功能,發現沒有那麼簡單,首先就因爲class類型沒有辦法轉型到其他的常用類型,看來還需要繼續研究.
[/size]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章