使用SSH框架的過(guò)程中,經(jīng)常涉及到修改,我們只要對(duì)部門的部門屬性進(jìn)行修改我們通常的做法是先從數(shù)據(jù)庫(kù)把對(duì)象查詢出來(lái)target,
再把從頁(yè)面上傳遞來(lái)的修改過(guò)的值封裝成為一個(gè)對(duì)象model,我們需要把model中修改過(guò)的屬性重新賦值給target,再對(duì)target進(jìn)行保存.完成修改.
在這個(gè)target.setXxx(model.getXxx)過(guò)程中有可能有大量的苦力工作要做,所以我利用反射做了一個(gè)簡(jiǎn)單的封裝,只需要傳遞兩個(gè)對(duì)象,就可以完成重新賦值的過(guò)程.
package cn.service.impl;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @Description:
* 通過(guò)兩個(gè)對(duì)象的傳入,進(jìn)行兩個(gè)對(duì)象的賦值,
* 共2個(gè)參數(shù),把第一個(gè)對(duì)象中的參數(shù)傳遞給第二個(gè)對(duì)象
* @author: 長(zhǎng)河
* @version:??? 0.0.2beta
* @Company:
* @date:?????? 2017年3月26日
*/
public class Demo {
//model是從前臺(tái)接受的數(shù)據(jù),封裝的對(duì)象
//target是從后臺(tái)根據(jù)id查詢到的數(shù)據(jù),封裝的對(duì)象
public static void setValue(T model,T target) throws Exception {
//獲得實(shí)體類
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的哪個(gè)屬性是否為空,利用get方法
Object object = getMethod.invoke(model);
if(object!=null) {
//不為空就進(jìn)行賦值
// 通過(guò)屬性名物蝙,來(lái)獲取對(duì)應(yīng)的setXXX的名字
String setMethodName = "set" + (fieldName.charAt(0)+"").toUpperCase() + fieldName.substring(1);
//這是set方法
Method setMethod = clazz.getMethod(setMethodName, field.getType());
//這里需要進(jìn)行類型的強(qiáng)制轉(zhuǎn)換嗎?
setMethod.invoke(target, object);
}
}
}
}
其實(shí)我覺(jué)得應(yīng)該是field.getType,得到參數(shù)的類型,根據(jù)類型控制對(duì)象中值的賦予,而不是簡(jiǎn)單的使用Object進(jìn)行賦值.不過(guò)經(jīng)過(guò)簡(jiǎn)單的測(cè)試,這個(gè)類可以使用,沒(méi)什么大問(wèn)題.
這是個(gè)簡(jiǎn)單的封裝還有其他的需要的條件可以考慮,可以把這個(gè)類封裝的更好
https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-18045781879.2.33c5236bZlPDUM&id=569353717228
深入理解Java虛擬機(jī)(jvm性能調(diào)優(yōu)+內(nèi)存模型+虛擬機(jī)原理)?? 很不錯(cuò)的虛擬機(jī)視頻教程.