?? extendedobjectpoolfactory.java
字號:
import java.util.*;
import java.io.*;
import java.lang.reflect.*;
/**
* Description:
* <br/>Copyright (C), 2008-2010, Yeeku.H.Lee
* <br/>This program is protected by copyright laws.
* <br/>Program Name:
* <br/>Date:
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
public class ExtendedObjectPoolFactory
{
//定義一個對象池,前面是對象名,后面是實際對象
private Map<String ,Object> objectPool =
new HashMap<String , Object>();
private Properties config = new Properties();
//從指定屬性文件中初始化Properties對象
public void init(String fileName)
{
FileInputStream fis = null;
try
{
//初始化文件輸入流
fis = new FileInputStream(fileName);
config.load(fis);
}
catch (IOException ex)
{
System.out.println("讀取" + fileName + "異常");
}
finally
{
try
{
if (fis != null)
{
fis.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
//定義一個創建對象的方法,
//該方法只要傳入一個字符串類名,程序可以根據該類名生成Java對象
private Object createObject(String clazzName)
throws InstantiationException , IllegalAccessException
,ClassNotFoundException
{
//根據字符串來獲取對應的Class對象
Class<?> clazz =Class.forName(clazzName);
//使用clazz對應類的默認構造器創建實例
return clazz.newInstance();
}
//該方法根據指定文件來初始化對象池,
//它會根據配置文件來創建對象
public void initPool()throws InstantiationException
,IllegalAccessException , ClassNotFoundException
{
for (String name : config.stringPropertyNames())
{
//每取出一對屬性名-屬性值對,如果屬性名中不包含百分號(%)
//就根據屬性值創建一個對象
//調用createObject創建對象,并將對象添加到對象池中
if (!name.contains("%"))
{
objectPool.put(name ,
createObject(config.getProperty(name)));
}
}
}
//該方法根據指定文件來初始化對象池,
//它會根據配置文件來創建對象
public void initProperty()throws InvocationTargetException
,IllegalAccessException,NoSuchMethodException
{
for (String name : config.stringPropertyNames())
{
//每取出一對屬性名-屬性值對,如果屬性名中包含百分號(%)
//即可認為該屬性是用于為對象設置屬性值,
//下劃線前半為對象名字,后半為屬性名
//程序將調用對應的setter方法來為對應屬性設置屬性值。
if (name.contains("%"))
{
//將配置文件中屬性名按_分割
String[] objAndProp = name.split("%");
//取出需要設置屬性的目標對象名
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);
//通過Method的invoke方法執行setter方法,
//將config.getProperty(name)的屬性值作為調用setter的方法的實參
mtd.invoke(target , config.getProperty(name));
}
}
}
public Object getObject(String name)
{
//從objectPool中取出指定name對應的對象。
return objectPool.get(name);
}
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"));
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -