java兩個物件之間傳值,簡單的封裝
使用SSH框架的過程中,經常涉及到修改,我們只要對部門的部門屬性進行修改我們通常的做法是先從資料庫把物件查詢出來target,
再把從頁面上傳遞來的修改過的值封裝成為一個物件model,我們需要把model中修改過的屬性重新賦值給target,再對target進行儲存.完成修改.
在這個target.setXxx(model.getXxx)過程中有可能有大量的苦力工作要做,所以我利用反射做了一個簡單的封裝,只需要傳遞兩個物件,就可以完成重新賦值的過程.
package cn.service.impl;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @Description:
* 通過兩個物件的傳入,進行兩個物件的賦值,
* 共2個引數,把第一個物件中的引數傳遞給第二個物件
* @author: 長河
* @version: 0.0.2beta
* @Company:
* @date: 2017年3月26日
*/
public class Demo {
//model是從前臺接受的資料,封裝的物件
//target是從後臺根據id查詢到的資料,封裝的物件
public static<T> void setValue(T model,T target) throws Exception {
//獲得實體類
Class clazz = model.getClass();
//檢視有那些欄位
Field[] fields = clazz.getDeclaredFields();
//遍歷
for (Field field : fields) {
//屬性的名字
String fieldName = field.getName();
//屬性的型別
//Class<?> type = field.getType();
//再得到getter方法的名字
String getMethodName = "get" + (fieldName.charAt(0)+"").toUpperCase() + fieldName.substring(1);
Method getMethod = clazz.getMethod(getMethodName);
//判斷model的哪個屬性是否為空,利用get方法
Object object = getMethod.invoke(model);
if(object!=null) {
//不為空就進行賦值
// 通過屬性名,來獲取對應的setXXX的名字
String setMethodName = "set" + (fieldName.charAt(0)+"").toUpperCase() + fieldName.substring(1);
//這是set方法
Method setMethod = clazz.getMethod(setMethodName, field.getType());
//這裡需要進行型別的強制轉換嗎?
setMethod.invoke(target, object);
}
}
}
}
其實我覺得應該是field.getType,得到引數的型別,根據型別控制物件中值的賦予,而不是簡單的使用Object進行賦值.不過經過簡單的測試,這個類可以使用,沒什麼大問題.
這是個簡單的封裝還有其他的需要的條件可以考慮,可以把這個類封裝的更好
https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-18045781879.2.33c5236bZlPDUM&id=569353717228
深入理解Java虛擬機器(jvm效能調優+記憶體模型+虛擬機器原理) 很不錯的虛擬機器視訊教程.