问题:通过类的全限定名来创建对象,并创建工厂对象
DEOM案例如下:
package invokeBeanFactorty;
import java.util.Date;
/**
* java反射通过类全限定名创建对象
* @author Administrator
*
*/
public class invokeObject {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
/*这里以java.util.Date为列子*/
Object obj = getInstance("java.util.Date");
/*这种方式需要强转 意义不大*/
Date date = (Date) obj;
System.out.println(date.toLocaleString());
/*在方法中预先对强转进行处理*/
Class claz = Class.forName("java.util.Date");
Date date1 = getInstance2("java.util.Date",Date.class);
System.out.println(date1.toLocaleString()+"方式2");
BeanFactory bf = new BeanFactory();
Date date2 = bf.getBeanFactory("java.util.Date",Date.class);
System.out.println(date2.toLocaleString()+"工厂方式创建对象");
}
/*1.通过全限定名获取对应的clas s对象*/
public static Object getInstance(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
Class claz = Class.forName(name);
return claz.newInstance();
}
/*2.通过泛型类型方式,在方法中预先强转*/
public static <T>T getInstance2(String name,Class<T> checkType) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
/*通过全限定名获取class对对象,并强转为对应泛型类型*/
Class<T> claa = (Class<T>) Class.forName(name);
Object obj = claa.newInstance();
/*判断是否是符合指定类型的对象,如果符合则转为指定的类型,否则抛出参数异常*/
if(checkType.isInstance(obj)){
return (T)obj;
}else{
throw new IllegalArgumentException("参数类型不匹配");
}
}
}
工厂创建注意涉及到设计模式中的单列模式:
DEMO如下
package invokeBeanFactorty;
/**
* 利用java反射创建一个对象工厂 创建对象工厂模式 涉及到设计模式中的单列模式
枚举单列模式的调用方式: Date date2 = BeanFactory.INSTANCE.getBeanFactory("java.util.Date",Date.class);
* @author Administrator
*
*/
public enum BeanFactory {
INSTANCE;
public <T>T getBeanFactory(String name,Class<T> checkType){
Object obj;
try {
Class<T> claz = (Class<T>) Class.forName(name);
obj = claz.newInstance();
if(!checkType.isInstance(obj)){
throw new IllegalArgumentException("参数类型不匹配");
}else{
return (T)obj;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}