//
package Chapter_4;
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<>();
// 定义一个对象池,前面时对象名,后面是实际对象
// 定义一个创建对象的方法,该方法只要传入一个字符串,就可以根据该类名生成java对象
private Object createObject(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
// 根据字符串获取对应的java对象
Class<?> clazz = Class.forName(className);
return clazz.newInstance();
}
// 根据指定的文件来初始化对象池
// 根据配置文件来创建对象
public void initPool(String fileName) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
try(
FileInputStream fis = new FileInputStream(fileName)) {
Properties props = new Properties();
// Properties可以从流中加载或者保存到流中,以键值对的形式处理数据,obj.txt中的数据就是以键值对
// 形式存储的
props.load(fis);
// 遍历文件中的每个键值对,并且以键为key,值对应的名字创建新的对象,组成一个map,也可以称之为对象池
for(String name : props.stringPropertyNames()){
objectPool.put(name, createObject(props.getProperty(name)));
}
}catch (IOException e){
System.out.println("读取" + fileName + "异常");
}
}
public Object getObject(String name){
return objectPool.get(name);
// 从objectPool中取出指定的值
}
public static void main(String args[]) throws Exception{
// main方法的运行过程是:读取一个文件中的键值对,接着根据这些键值对创建一个对象池,在通过
// 以键取值的方式获得这些对象
ObjectPoolFactory pf = new ObjectPoolFactory();
pf.initPool("obj.txt");
System.out.println(pf.getObject("a"));
System.out.println(pf.getObject("b"));
}
}
//运行程序,可以看到下面的输出结果
// Mon Oct 01 08:38:10 CST 2018
// 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]
package Chapter_4;
import java.lang.reflect.Constructor;
public class CreateJFrame {
public static void main(String args[]) throws Exception{
Class<?> jframeClazz = Class.forName("javax.swing.JFrame");
// forName使用Class.forName方法获得Class对象
Constructor ctor = jframeClazz.getConstructor(String.class);
// 获取JFrame类中参数为一个字符串的构造方法
Object obj = ctor.newInstance("测试窗口");
// 创建对象
System.out.println(obj);
// 将该对象输出
}
}
//运行程序,可以看到下面的输出:
// 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]