在很多Java EE 框架中都需要根据配置文件信息来创建Java对象,从配置文件读取的只是i某个类的字符串类名,程序就需要根据该字符串来创建对应的实例,就必须使用反射。
下面程序就实现了一个简单的对象池,该对象池会根据配置文件读取name-value对,然后创建这些对象,并将这些对象放入一个HashMap中。
package com.reflect; import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class ObjectPoolFactory { //定义一个对象池,前面是对象名,后面是实际对象 private Map<String,Object> objectPool=new HashMap<String,Object>(); //定义一个创建对象的方法 //该方法只要传入一个字符串类名,程序就可以根据该类名生成Java对象 private Object createObject(String clazzName) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ //根据字符串来获对应的Class对象 Class<?> clazz=Class.forName(clazzName); //使用clazz对应的默认构造器创建实例 return clazz.newInstance(); } //该方法根据指定文件来初始化对象池 //它根据配置文件来创建对象 public void initPool(String fileName){ FileInputStream fis=null; try { fis=new FileInputStream(fileName); Properties props=new Properties(); props.load(fis); for(String name:props.stringPropertyNames()){ //每取出一对属性名--属性值对,就根据属性创建一个对象, //调用createObject创建对象,并将对象添加到对象池中 objectPool.put(name, createObject(props.getProperty(name))); } } catch (Exception e) { e.printStackTrace(); } finally{ try { if(fis!=null){ fis.close(); } } catch (IOException e) { e.printStackTrace(); } } } public Object getObejct(String name){ //从objectPool中获取指定name对应的对象. return objectPool.get(name); } public static void main(String[] args) { ObjectPoolFactory pf=new ObjectPoolFactory(); pf.initPool("D:/mavenwork/mianshi/src/com/reflect/obj.txt"); System.out.println(pf.getObejct("a")); } }
obj.txt 文件内容如下:
a=java.util.Date
b=javax.swing.JFrame