zoukankan      html  css  js  c++  java
  • 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();就行了是不是很简便啊 。

      

  • 相关阅读:
    android 上传文件到百度云
    android 学习参考
    利用SSH在本机和远程服务器之间传输文件或文件夹
    指定GPU运行python程序
    ubuntu18.04调整终端字体大小
    ubuntu18.04安装搜狗输入法
    pip install .whl文件时is not a supported wheel on this platform.解决方法
    jmeter实现mysql的增删改查
    jmeter实现天气webservice请求
    常见算法 python实现
  • 原文地址:https://www.cnblogs.com/airycode/p/4829460.html
Copyright © 2011-2022 走看看