用父類對象給子類對象賦值數據


在寫畢業設計的時候遇到了一些小問題,當創建一個VO類的時候,繼承原先的PO類再添加新的屬性比較快捷方便,但是將PO類轉換成VO類就會需要先get再set所有屬性。雖然說是面向ctrl+c、ctrl+v編程,但是還是想偷懶,所以有了以下代碼:

/**
 * 將父類對象的屬性值轉儲到子類對象中,僅限於get(is)方法set方法規范且並存,更適用於數據庫實體類,不適用於功能性類
 * @param <T>
 * @param son 子類對象
 * @param father 父類對象
 * @throws Exception
 */
public static <T> void dump(T son, T father) throws Exception {
	//判斷是否是子類
	if(son.getClass().getSuperclass() != father.getClass()) {
		throw new Exception("son is not subclass of father");
	}
	Class<? extends Object> fatherClass = father.getClass();
	//父類屬性
	Field[] fatherFields = fatherClass.getDeclaredFields();
	//父類的方法
	Method[] fatherMethods = fatherClass.getDeclaredMethods();
	for (Field field : fatherFields) {
		StringBuilder sb = new StringBuilder(field.getName());
		//首字母轉大寫
		sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
		Method get = null, set = null;
		//遍歷找屬性get(is)方法和set方法
		for (Method method : fatherMethods) {
			if (method.getName().contains(sb)) {
				//get方法或is方法
				if(method.getParameterCount() == 0) {
					get = method;
				} else {//set方法
					set = method;
				}
			}
		}
		set.invoke(son, get.invoke(father));
	}
}

主要是通過反射來實現的,主要思路如下:

  1. 取父類的屬性名稱,首字符轉大寫。
  2. 遍歷父類的方法,找到包含第一步屬性名的方法。
  3. 根據方法參數個數判斷是get還是set,boolean類型的屬性的get方法是isXxxx這個沒有什么關系。
  4. 進行方法調用,父類對象調get方法,子類對象調set方法。

PO類:對應數據庫表的類,屬性對應數據庫表字段。

VO類:業務層之間用來傳遞數據的,可能和PO類屬性相同,也可能多出幾個屬性。


免責聲明!

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



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