实现对象池,以配置文件的方式
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]

浙公网安备 33010602011771号