通过反射生成对象有两种方法:
(1)使用Class对象的newInstance()方法来创建Class对象相应的实例,这种方法使用的是默认构造器,而执行newInstance()实际上是创建了一个实例
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.io.FileInputStream;
public class ObjectPoolFactory
{
private Map<String,Object> objectPool=new HashMap<String,Object>();
//根据字符串类名,创建一个类实例
private Object createObject(String clazzName) throws Exception{
Class<?> clazz=Class.forName(clazzName);
return clazz.newInstance();
}
public void initPool(String fileName) throws Exception{
FileInputStream fis=null;
try{
fis=new FileInputStream(fileName);
Properties props=new Properties();
props.load(fis);
for(String name:props.stringPropertyNames()){
System.out.println(name);
objectPool.put(name,createObject(props.getProperty(name)));
}
catch(Exception e){
System.out.println("fail");
}
finally{
try{
if(fis!=null){fis.close();}
}
catch(Exception ex){ex.printStackTrace();}
}
}
}
public Object getObject(String name){
return objectPool.get(name);
}
public static void main(String[] args) throws Exception{
ObjectPoolFactory opf=new ObjectPoolFactory();
opf.initPool("obj.txt");
System.out.println(opf.getObject("a"));
}
}
(2)先使用Class对象获取指定的Constructor对象,再调用Contructor对象的newInstance方法 创建该Class对象对应的实例,通过这种方法可以选择使用某种类的指定构造器来创建实例
public class CreateJFrame
{
public static void main(String[] args) throws Exception
{
Class<?> jframeClazz=Class.forName("javax.swing.JFrame");
Constructor ctor=jframeClazz.getConstructor(String.class);
//对应的构造器
Object obj=ctor.newInstance("测试窗口");
System.out.println(obj);
}
}