最近遇到一個問題,要完成兩個對象之間的複制,也就是根據對象A的屬性值生成對應的對象B。其中A與B的屬性名不同,但是其實是一個東西。前後交了不同的名字而已。因為會後很多的這樣的情況,不可能每一個對象都寫一個方法。我尋求一種通用的方法。網上找到BeanUtils.copyProperties()等方法copy對象要求屬性名一緻才可以複制。。研究了一天最後自己解決。特此貼出來給同樣碰到此問題的同學們分享!!思路就是,在每一個背景對象中添加與前端對象的的屬性名映射表例如Map<String,string> param;param.put("name","id")..
然後寫一個工具方法完成如下功能:
利用反射獲得A的屬性名數組,使用new CglibBean(temp)動态生成對應的轉換了屬性名的Object對象。(CglibBean用法請百度)。然後使用PropertyUtils.copyProperties(k, object);完成對象複制。具體看代碼自己領悟:
------------------------------------------------------------------------------------------------------------------------------------------------
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.PropertyUtils;
import com.xiao2edu.setcfg.server.entity.TeacherPeriod;
import com.xiao2edu.setcfg.server.param.StringParam1;
public class BeanConvert {
//k為對應的實體對象,J為StringParam對象,param為屬性名對應表
public static Object getObject(Object k,Object j,Map<String,String> param) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
//BeanUtils.copyProperties(k, j, str);
//擷取實體對象屬性名數組
Field[] fields=j.getClass().getDeclaredFields();
//屬性名,屬性類型
Map<String , Class> temp=new HashMap<>();
//屬性名,屬性值
Map<String , String> valueParam=new HashMap<>();
for(Field f:fields){
//設定通路權限,否則不能通路私有化屬性
f.setAccessible(true);
//轉換屬性名,屬性類型
temp.put(param.get(f.getName()), Class.forName("java.lang.String"));
String value="";
Object valueObject=f.get(j);
if(valueObject!=null){
value=valueObject.toString();
}
valueParam.put(param.get(f.getName()), value);
//System.out.println("哈哈"+valueParam.toString());
}
//System.out.println("AAA:"+temp.toString());
//根據參數數組生成CglibBean對象
CglibBean cglibBean=new CglibBean(temp);
for(Map.Entry<String, String> entry:valueParam.entrySet()){
//System.out.println(entry.getKey());
cglibBean.setValue(entry.getKey(), entry.getValue());
}
Object object=cglibBean.getObject();
//用object給K指派
PropertyUtils.copyProperties(k, object);
return k;
}
public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
TeacherPeriod teacherPeriod=new TeacherPeriod();
StringParam1 stringParam1=new StringParam1("11","22","33","44");
teacherPeriod=(TeacherPeriod) getObject( teacherPeriod ,stringParam1,teacherPeriod.getMapping());
System.out.println(stringParam1.getA());
System.out.println(teacherPeriod.toString());
}
}