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();就行了是不是很簡便啊 。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM