实现对象池,以配置文件的方式

package huang.de.wei;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
//实现了简单的对象池,该对象池会根据配置文件读取name-value
//然后创建这些对象,并将这些对象放入一个HashMap

public class ObjectPoolFactory {
//定义一个对象池,前面是对象名后面是实际对象
    private Map<String,Object> objectPool=
        new HashMap<String,Object>();
    //定义一个创建对象发的方法
    //该方法只要传入一个字符串类名,程序就可以根据该类名生成java对象
    private Object creatObject(String clazzName) throws ClassNotFoundException, InstantiationException, IllegalAccessException
    {
        Class<?> clazz=Class.forName(clazzName);
        return clazz.newInstance();
        
    }
    //该方法根据指定的配置文件来初始化对象池
    //它会根据裴菊文件来创建对象
    public void initPool(String fileName) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
        FileInputStream fis = null;
        try {
            //FileInputStream fis = null;//fis如果定义在这里,后面finally里面用到fis的时候回出错!变局部变量了
            int i;
            fis = new FileInputStream(fileName);
            Properties props = new Properties();
            props.load(fis);
            for (String name : props.stringPropertyNames()) {
                //没取出一对属性名-属性值,就是根据属性值创建一个对象
                //调用createObject创建对象,并将对象添加到对象池中
                objectPool.put(name, creatObject(props.getProperty(name)));
            }
        } catch (IOException e) {
            
            
            // TODO: handle exception
    System.out.println("读取"+fileName+"异常");
        } finally {
            try {
                if(fis != null){
                    fis.close();
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    public Object getObject(String name){
        //从objectPool中取出指定name对应的对象
        return objectPool.get(name);
        
    }
    public static void main(String[] args) throws Exception{
        ObjectPoolFactory pf =new ObjectPoolFactory();
        pf.initPool("obj.txt");
        System.out.println(pf.getObject("a"));

System.out.println("---------分割线---------------");
  //下面代码是调用指定构造器来反射对象的
  //获取JFrame对应的class对象
  Class<?> jframeClazz=Class.forName("javax.swing.JFrame");
  //获取JFranme中带字符串的构造器
  Constructor ctor=jframeClazz.getConstructor(String.class);
  //调用Constructor的newInstance方法创建对象
  Object obj=ctor.newInstance("测试窗口");
  //输出JFrame对象
  System.out.println(obj);
} }

在项目工程下右键新建文件-obj.txt,文件内容如下:

a=java.util.Date
b=javax.swing.JFrame

 


运行结果:

 

Sat Apr 01 11:12:20 CST 2017
---------分割线---------------
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]

posted @ 2017-04-01 10:44  一枚IT散人  阅读(348)  评论(0)    收藏  举报