使用java反射实现对象工厂
如:提供一个方法,根据传入的类的全限定名,创建对象,并返回
public static Object createeInstance(String className){
try{
1.得到字节码对象
Class clz=Class.forName(className);
2.获得实例
Object obj=clz.newInstance();
return obj;
}
cacth(Exception e){
e.printStackTrace();
}
return null;
}
Eg:
Date d1=(Date) createrInstance(“java.util.Date”);
System.out.println(d1.toLocaleString());
要调用Date中的oLocaleString()方法,需要进行强制类型转换
每次创建出来的对象,要使用其方法或属性,都要强制转换成目标类型,解决方案:使用泛型方法
public static <T> T createeInstance(Class<T> className){
try{
1.得到字节码对象
Class clz=Class.forName(className);
2.获得实例
Object obj=clz.newInstance();
return obj;
}
cacth(Exception e){
e.printStackTrace();
}
return null;
}
Eg:
Date d1=createrInstance(Date.class);
System.out.println(d1.toLocaleString());
解决方案:将上述两种方案综合即可
Class objectFactory{
public static <T> T createeInstance(String className,Class<T> checkedType){
try{
1得到字节码对象
Class<T> clz=(Class<T>) Class.forName(className);
2获得实例
Object obj=clz.newInstance();
//需要检测checkedType是否是obj的字节码对象
if(!checkedTpye.isInstance(obj)){
throw new IllegalArgumentException(“对象和类型不兼容”);
}
return (T) obj;
}
cacth(Exception e){
e.printStackTrace();
}
return null;
}
}
Class类的isInstance(Object obj)方法,obj是被测试的对象,如果obj是调用这个方法的class或接口 的实例,则返回true。这个方法是instanceof运算符的动态等价。
形象地:自身类.class.isInstance(自身实例或子类实例) 返回true
工具类的编写:
方式一:
1.把工具类声明成单例模式
2.把类中的方法声明成非static
调用工具方法,首先得到工具类对象,在调用
方式二:
1.把工具类所有的构造器全部私有化
2.把工具类的方法声明为static方法
使用类名.方法名()方式调用工具方法