java反射之根据全类名创建对象
现在的需求是根据类的全名。来创建对象
package 中介者设计模式; import java.util.Date; public class CreateObject { public static void main(String[] args) { Object obj = createInstance("java.util.Date"); System.out.println(obj); Date d = createInstance(Date.class); System.out.println(d); } //提供一个方法,根据传入的参数全名创建一个对象并且返回 public static Object createInstance(String className){ try { Class clz = Class.forName(className); Object obj = clz.newInstance(); return obj; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //重载的方法(这个方法还是没有解决问题) public static <T> T createInstance(Class<T> clz){ try { return clz.newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //传递一个类的全新类名来调用对象,将上述两种方案进行合体 public static <T> T createInstance(Class<T> checkType,String className){ try { Class<T> clz = (Class<T>)Class.forName(className); Object obj = clz.newInstance(); //需要检查checkType是不是obj的字节码对象 if (!checkType.isInstance(obj)) { throw new Exception("对象跟字节码不兼容"); } return (T)obj; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
Spring也是这样做的。我们把公用的代码封装到一个工具类中,就可以了。
package 中介者设计模式; //对象工厂 public class BeanFactory { //传递一个类的全新类名来调用对象,将上述两种方案进行合体 public static <T> T getBean(Class<T> checkType,String className){ try { Class<T> clz = (Class<T>)Class.forName(className); Object obj = clz.newInstance(); //需要检查checkType是不是obj的字节码对象 if (!checkType.isInstance(obj)) { throw new Exception("对象跟字节码不兼容"); } return (T)obj; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
大家都知道工厂的设计模式是单例的设计模式:
单例的设计模式写法有好几种形式比如1:枚举方法创建工厂射进模式
package 中介者设计模式; //对象工厂 public enum BeanFactory { //传递一个类的全新类名来调用对象,将上述两种方案进行合体 INSTANCE; public <T> T getBean(Class<T> checkType,String className){ try { Class<T> clz = (Class<T>)Class.forName(className); Object obj = clz.newInstance(); //需要检查checkType是不是obj的字节码对象 if (!checkType.isInstance(obj)) { throw new Exception("对象跟字节码不兼容"); } return (T)obj; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
外界是怎么调用这个方法那,BeanFactory.INSTANCE.getBean();就行了是不是很简便啊 。
posted on 2015-09-22 16:56 airycode 阅读(13504) 评论(0) 编辑 收藏 举报